【问题标题】:Binary Tree Recursive InOrder method confusion二叉树递归 InOrder 方法混淆
【发布时间】:2017-10-24 07:53:24
【问题描述】:

我正在为数据结构类研究一棵红黑树。

我有代码:

void printInorder(Node node)    //Input is initially the root node 
{ 
     if (node == null) 
     { 
           return; 
     } 
     printInorder(node.left); 
     System.out.println(node.data); 
     printInorder(node.right); 
} 

我们以这个二叉树为例:

           50 
          /    \ 
       40     60 
      /    \       \ 
     20    45      70 
        /   \      / 
        43  47  65 

代码的输出是正确的,是:20 40 43 45 47 50 60 65 70

我对代码的理解是,它会递归调用 printInorder(node.left) 直到达到 20。

此时,它将打印“20”,然后检查 printInorder(node.right),发现它为空并返回到 printInorder(node.right) 语句,此时它位于方法的底部并且没有更多的代码可以运行,所以它退出了。

输出是正确的,但根据我对代码的理解,它应该在打印“20”后停止。

有人可以为我一步一步地解释这个递归循环的过程吗?请假装你正在向有精神障碍的人解释它。谢谢。

【问题讨论】:

    标签: java recursion binary-search-tree


    【解决方案1】:

    有个笑话“要理解递归,首先要理解递归”

    首先让我们看一下函数。它有什么作用?

    • 检查是否有左节点以及是否存在(尚未打印)

    • 如果没有左节点打印

    • 检查是否有正确的节点并去那里。

    所以这里执行。

    1. 第一次执行 printInorder(50) 检查是否已离开 - 转到左侧节点(打印等待)
    2. 现在使用左节点 printInorder(40) 执行第二次 检查是否有离开节点 - 是的!打印到左边等待
    3. 第三次执行左节点 printInorder(20) 它有左节点吗?不!调用 printInorder(null) 并继续执行。 现在打印了 20 个!它有正确的节点吗?没有
    4. 我们回去!到我们有 printinorder(40) 的第 2 步,但现在我们在到达 leftNode 之后。所以我们打印 40 并检查正确的节点 - 瞧,找到了 45!
    5. 转到 45 并检查是否有剩余节点(打印 45 等待)。左节点为 43
    6. 转到 printinorder(43),因为它没有左打印它!

    就这样……

    【讨论】:

    • 我没有意识到它会在转到左侧节点之后返回到该点。我认为 return 神奇地使代码反转了一行。谢谢!
    【解决方案2】:
    call printInorder (node 50) // root
      call printInorder (40) // left child of 50
        call printInorder (20) // left child of 40
          call printInorder (null) // left child of 20
          print 20
          call printInorder (null) // right child of 20
        print 40
        call printInorder (45) // right child of 40
          call printInorder (43) // left child of 45
            call printInorder (null) // left child of 43
            print 43
            call printInorder (null) // right child of 43
          print 45
          call printInorder (47) // right child of 45
            call printInorder (null) // left child of 47
            print 47
            call printInorder (null) // right child of 47
    print 50
    call printInorder (60) // right child of 50
      ...
    

    等等

    【讨论】:

      【解决方案3】:

      我对代码的理解是它会递归调用 printInorder(node.left) 直到达到 20。

      正确。

      此时,它将打印“20”,然后检查 printInorder(node.right),发现它为 null 并返回到 printInorder(node.right) 语句......

      这是你错过了一个关键点的地方。

      它不会返回到printInOrder(node.right),而是返回到printInOrder(40){ ... System.out.println(node.data); ...},然后是printInOrder(40){ ... printInOrder(node.right); ...}

      【讨论】:

        猜你喜欢
        • 2017-05-08
        • 2013-07-20
        • 1970-01-01
        • 2020-07-31
        • 1970-01-01
        • 1970-01-01
        • 2016-04-19
        • 2014-03-29
        • 2021-07-26
        相关资源
        最近更新 更多