繁体   English   中英

如何在golang中使用struct创建二叉树?

[英]How to create a binary tree use struct in golang?

我想创建一个二叉树并使用golang初始化该树。 像这样的代码:

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)
}

为什么树的左右为零? 我通过树节点的引用,为什么不起作用?

tree只是指针的副本。 分配给变量是没有用的。 相反,您需要分配给已经存在的节点。 例如:

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)
        }
    }
}

在C / C ++编程语言中,可以使用TreeNode *&tree
但是在golang编程语言中,不能使用*&
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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM