BST golang функция поиска - PullRequest
0 голосов
/ 02 мая 2020

Вы можете помочь с поиском веселья c, он всегда возвращает ноль, и я не могу понять, почему

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

искал inte rnet и нашел много методов, но мне нужно как весело c. Я новичок в программировании, поэтому мне трудно понять

PlayGoundLink

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

окей, https://play.golang.org/p/gQmdYLfAvIY этот код работает, в BTreeInsertData забыли добавить Parant и в BTreeSearchItem я не соответствую Right и Left

0 голосов
/ 02 мая 2020

Я предлагаю проверить значение root в main() перед вызовом функции BTreeSearchItem. Я подозреваю, что root значения уже nil на этой стадии.

...