亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

golang binaryTree Preorder返回值不正確

golang binaryTree Preorder返回值不正確

Go
青春有我 2023-05-22 16:59:41
我想將所有節點的值作為一個數組返回,但是返回值是錯誤的。type TreeNode struct {    Left  *TreeNode    Right *TreeNode    Val   int}type BinaryTree struct {    Root *TreeNode}    func PreorderRecursion(root *TreeNode, result []int) []int {    if root == nil {        return nil    }    result = append(result, root.Val)    res1 :=PreorderRecursion(root.Left,result)    res2 :=PreorderRecursion(root.Right,result)    result = append(result,res1...)    result = append(result,res2...)    return result}func TestBinaryTree_PreOrder(t *testing.T) {    tree := BinaryTree{}    tree.Root = &TreeNode{Val: 1}    tree.Root.Left = &TreeNode{Val: 2}    tree.Root.Right = &TreeNode{Val: 3}    tree.Root.Left.Left = &TreeNode{Val: 4}    var result []int    result =PreorderRecursion(tree.Root,result)    fmt.Println(result,"----")}正確的結果應該是:1 2 4 3但我明白了:[1 1 2 1 2 4 1 3]
查看完整描述

2 回答

?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

切片保存對底層數組的引用,如果將一個切片分配給另一個切片,則兩者都引用同一個數組。如果一個函數接受一個切片參數,它對切片元素所做的更改將對調用者可見

PreorderRecursion不應接受切片并對其進行更改。這是一種方法。

func PreorderRecursion(root *TreeNode) []int {

? ? if root == nil {

? ? ? ? return nil

? ? }

? ? result := append([]int{}, root.Val)

? ? res1 := PreorderRecursion(root.Left)

? ? res2 := PreorderRecursion(root.Right)

? ? result = append(result, res1...)

? ? result = append(result, res2...)

? ? return result

}


查看完整回答
反對 回復 2023-05-22
?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

問題源于您將result切片傳遞給遞歸調用。因此,每個遞歸調用都會附加上面節點的結果。你期望1 2 4 3,但是你1從第一個電話中得到,然后1 2(而不是只是2)從第二個電話中得到,然后1 2 4(而不是只是4)從第三個電話中得到。

要解決此問題,您只需刪除將結果切片傳遞給遞歸函數即可。該函數應該只為它所在的節點加上它的后代樹創建一個結果切片,它不需要知道父節點的結果是什么。


查看完整回答
反對 回復 2023-05-22
  • 2 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號