2017-09-05 16 views
0

私はバイナリツリーを作成し、ツリーを初期化するgolangを使用したいと思います。 そして、これらのようなコード:バイナリツリーの作成方法golangでstructを使用しますか?

package Tree 

import "fmt" 

type TreeNode struct { 
    Left *TreeNode 
    Right *TreeNode 
    Value int 
} 


func InsertNodeToTree(tree *TreeNode, node *TreeNode)(){ 
    if tree == nil { 
     tree = node 
    } 
    if node.Value > tree.Value { 
     InsertNodeToTree(tree.Right, node) 
    } 
    if node.Value < tree.Value { 
     InsertNodeToTree(tree.Left, node) 
    } 
} 

func InitTree(values ...int) (root *TreeNode) { 
    rootNode := TreeNode{Value: values[0]} 
    for _, value := range values { 
     node := TreeNode{Value:value} 
     InsertNodeToTree(&rootNode, &node) 
    } 
    return &rootNode 
} 

func main() { 
    treeNode := InitTree(5, 4, 6, 8, 9, 7, 1, 3, 2) 
    fmt.Println(treeNode) 
} 

ツリーの左と右がnilである理由? ツリーノードの参照を渡しますが、なぜ動作しませんか?

答えて

1

、あなたはTreeNode *&treeを使用することができます。
しかし、ゴランプログラミング言語では、*&は使用できません。
treeはポインタのコピーに過ぎないので、別のTreeNodeをポイントすることはできません。
プログラムを修正しましたが、今すぐ正常に実行できます。
必要なコードは次のとおりです。

package Tree 

type TreeNode struct { 
    Left *TreeNode 
    Right *TreeNode 
    Value int 
} 


var DefaultValue int = -1024 


func InsertNodeToTree(tree *TreeNode, node *TreeNode)(){ 
    if tree == nil { 
     return 
    } 
    if tree.Value == DefaultValue { 
     tree.Value = node.Value 
     return 
    } 
    if node.Value > tree.Value { 
     if tree.Right == nil { 
      tree.Right = &TreeNode{Value: DefaultValue} 
     } 
     InsertNodeToTree(tree.Right, node) 
    } 
    if node.Value < tree.Value { 
     if tree.Left == nil { 
      tree.Left = &TreeNode{Value: DefaultValue} 
     } 
     InsertNodeToTree(tree.Left, node) 
    } 
} 

func InitTree(values ...int) (root *TreeNode) { 
    rootNode := TreeNode{Value: DefaultValue, Right: nil, Left: nil} 
    for _, value := range values { 
     node := TreeNode{Value:value} 
     InsertNodeToTree(&rootNode, &node) 
    } 
    return &rootNode 
} 
4

treeはポインタのコピーです。変数への代入は役に立たない。代わりに、既存のノードに割り当てる必要があります。たとえば:C/C++プログラミング言語で

https://play.golang.org/p/Agzby-Yinq

func InsertNodeToTree(tree *TreeNode, node *TreeNode) { 
    if tree == nil { 
     panic("cannot insert into nil root") 
    } 

    if node.Value > tree.Value { 
     if tree.Right == nil { 
      tree.Right = node 
     } else { 
      InsertNodeToTree(tree.Right, node) 
     } 
    } 
    if node.Value < tree.Value { 
     if tree.Left == nil { 
      tree.Left = node 
     } else { 
      InsertNodeToTree(tree.Left, node) 
     } 
    } 
} 
関連する問題