BST golang搜索功能

问题描述 投票:0回答:1

你可以帮助搜索函数,它总是返回nil,我不明白为什么。

func BTreeSearchItem(root *TreeNode, elem string) *TreeNode {
    if root == nil {
        return nil
    }
    if root.Data < elem {
        return BTreeSearchItem(root.Left, elem)
    } else if root.Data > elem {
        return BTreeSearchItem(root.Right, elem)
    }
    return root
}

尝试像这样做,但它返回4而不是7。

func BTreeSearchItem(root *TreeNode, elem string) *TreeNode {
    if root == nil {
        return nil
    }
    if root.Data < elem {
        BTreeSearchItem(root.Left, elem)
    } else if root.Data > elem {
        BTreeSearchItem(root.Right, elem)
    }
    return root
}

完整的代码是

package main

import "fmt"

type TreeNode struct {
    Left, Right, Parent *TreeNode
    Data                string
}

func BTreeSearchItem(root *TreeNode, elem string) *TreeNode {
    if root == nil {
        return nil
    }
    if root.Data < elem {
        BTreeSearchItem(root.Left, elem)
    } else if root.Data > elem {
        BTreeSearchItem(root.Right, elem)
    }
    return root
}

func BTreeInsertData(root *TreeNode, data string) *TreeNode {
    if root == nil {
        return &TreeNode{Data: data}
    }
    if root.Data == data {
        return nil
    }
    if root.Data > data {
        if root.Left == nil {
            root.Left = &TreeNode{Data: data}
        }
        return BTreeInsertData(root.Left, data)
    }
    if root.Data < data {
        if root.Right == nil {
            root.Right = &TreeNode{Data: data}
        }
        return BTreeInsertData(root.Right, data)
    }
    return root
}

func main() {
    root := &TreeNode{Data: "4"}
    BTreeInsertData(root, "1")
    BTreeInsertData(root, "7")
    BTreeInsertData(root, "5")
    selected := BTreeSearchItem(root, "7")
    fmt.Print("Item selected -> ")
    if selected != nil {
        fmt.Println(selected.Data)
    } else {
        fmt.Println("nil")
    }

    fmt.Print("Parent of selected item -> ")
    if selected.Parent != nil {
        fmt.Println(selected.Parent.Data)
    } else {
        fmt.Println("nil")
    }

    fmt.Print("Left child of selected item -> ")
    if selected.Left != nil {
        fmt.Println(selected.Left.Data)
    } else {
        fmt.Println("nil")
    }

    fmt.Print("Right child of selected item -> ")
    if selected.Right != nil {
        fmt.Println(selected.Right.Data)
    } else {
        fmt.Println("nil")
    }
}

在互联网上搜索,发现了很多方法,但我需要作为func.I'm初学者在编程,所以它很难让我明白。

玩球网

go binary-search-tree
1个回答
0
投票

我的建议是检查 rootmain() 在调用函数前 BTreeSearchItem. 我怀疑的是 root 值已经是 nil 在该阶段本身。


0
投票

okey。https:/play.golang.orgpgQmdYLfAvIY。 这个代码的工作,在 BTreeInsertData 忘加 Parant 并在 BTreeSearchItem 我不匹配 RightLeft

© www.soinside.com 2019 - 2024. All rights reserved.