【问题标题】:Recursive Search in BST TraversalBST遍历中的递归搜索
【发布时间】:2021-05-28 15:03:34
【问题描述】:

我对 golang 中的二叉搜索树 (BST) 遍历解决方案的结构感到困惑。例如,当我们想从下面的树中获取 InOrderTraverse 输出时,输出应该是 [1, 2, 5, 5, 10, 15, 22]。


         10            
       /    \
      5      15
     / \       \
    2   5       22
   /
  1
   

我们将首先通过if tree.Left !=nil 检查左树,以便我们可以到达叶节点(在本例中为 1)。由于叶子节点是tree.Left == nil,我们只需将值附加到切片`array = append(array, tree.Value)。

我的困惑是从这里开始的,我们现在站在叶节点1,下一个代码是检查当前节点if tree.Right != nil{是否有正确的节点,因为1是这棵树中的最后一个节点,所以我们只需返回数组,即切片中只存储 1。

到达叶节点 1 后发生了什么,以及如何将节点向后/向上移动,例如从 1 到 2 或 2 到 5。我真的很困惑递归函数是如何工作的......

type BST struct {
    Value int

    Left  *BST
    Right *BST
}

func (tree *BST) InOrderTraverse(array []int) []int {
    if tree.Left != nil {
        array = tree.Left.InOrderTraverse(array)
    }   

    array = append(array, tree.Value)
    if tree.Right != nil {
        array = tree.Right.InOrderTraverse(array)
    }
    return array
}

【问题讨论】:

    标签: go binary-tree binary-search-tree


    【解决方案1】:

    如果 tree.Right != nil{ 并且什么都没有,因为 1 是这棵树中的最后一个节点,所以我们只需返回数组,

    这是正确的,但您需要考虑所谓的InOrderTraverse,因为这决定了在return 之后继续执行的位置。在这种情况下,它是从InOrderTraverse(对于值为2 的节点)调用的,所以下一步是array = append(array, tree.Value)tree.Value2),然后它检查节点右分支(什么都没有该节点,但随后它将 return 到节点 5 并找到正确的分支)。

    如果我们添加一些输出来显示正在检查的级别以及到达那里的路径,这可能会更容易理解:

    func (tree *BST) InOrderTraverse(level int, path string, array []int) []int {
        fmt.Printf("level %d, path %s\n", level, path)
        if tree.Left != nil {
            array = tree.Left.InOrderTraverse(level +1, path + "L", array)
        }
    
        array = append(array, tree.Value)
        if tree.Right != nil {
            array = tree.Right.InOrderTraverse(level +1, path + "R", array)
        }
        fmt.Printf("Done at level %d, path %s\n", level, path)
        return array
    }
    

    这将输出:

    level 1, path 
    level 2, path L
    level 3, path LL
    level 4, path LLL
    Done at level 4, path LLL
    Done at level 3, path LL
    level 3, path LR
    Done at level 3, path LR
    Done at level 2, path L
    level 2, path R
    level 3, path RR
    Done at level 3, path RR
    Done at level 2, path R
    Done at level 1, path  
    

    playground 中尝试一下。希望这会有所帮助;递归可能很难理解,但有大量可用的文章/视频(无论语言如何,基本原理都是相同的)。

    【讨论】:

    • 谢谢,解释很清楚,我现在明白这个概念了!
    猜你喜欢
    • 1970-01-01
    • 2016-12-15
    • 2019-04-09
    • 1970-01-01
    • 2013-04-15
    • 2021-03-25
    • 2020-09-25
    • 2013-05-12
    • 1970-01-01
    相关资源
    最近更新 更多