二叉树递归InOrder方法混淆

时间:2017-10-24 07:53:24

标签: java recursion binary-search-tree

我正在为数据结构类的Red Black树工作。

我有代码:

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),看到它为null并返回到printInorder(node.right)语句,此时它位于方法的底部,没有更多的代码可以运行,因此它退出。

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

有人可以逐步解释这个递归循环的过程,对我来说是一步一步吗?请假装你正在向有精神障碍的人解释。谢谢。

3 个答案:

答案 0 :(得分:2)

有这个笑话"为了理解递归,首先应该理解递归"

首先让我们看看这个功能。它做了什么?

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

  • 如果没有左节点打印

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

所以在这里执行。

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

答案 1 :(得分:1)

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
  ...

等等

答案 2 :(得分:0)

  

我对代码的理解是它会递归调用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); ...}