如何使用二叉树中的recusrion完成回溯

Air*_*ire 4 java recursion binary-tree

我正在尝试插入二进制节点.我的代码很复杂,没有希望拯救它,所以我打算重写它(基本上我没有考虑回溯,并没有考虑所有密切关注的算法).

我正在尝试使用顺序遍历插入二进制节点,但我不明白我应该如何回溯.

     D
    / \
   B   E 
  / \ / \
 A  C F 
Run Code Online (Sandbox Code Playgroud)

我如何搜索根D的左子树,然后返回并搜索正确的子树?这可能是一个愚蠢的问题,但我很难过.我能想到的最好的是这样的:

 if (!root.hasLeftChild) {
      root = root.getLeftChild(); 
      recurse(root); 
 } 
Run Code Online (Sandbox Code Playgroud)

但是当我到达底部时,我无法回到根部.此外,它没有解决问题,如果我到达左下方节点,我必须在开始回溯之前填充该节点的两个子节点.

我想我正在以错误的方式思考这个问题.

Noo*_*tor 5

树:

     D
    / \
   B   E 
  / \ / \
 A  C F 
Run Code Online (Sandbox Code Playgroud)

递送:

使用InOrder Traverse

  if (root == null) 
    return;

      recurse(root.getLeftChild()); 
      int rootData = root.getData();
      recurse(root.getRightChild()); 
Run Code Online (Sandbox Code Playgroud)

现在,它如何递归:

root.getLeftChild()将继续递归调用左子子,除非它击中null节点(所以控制不会去recurse(root.getRightChild());除非null节点被击中)

树到目前为止旅行:

         D
        / 
       B    
      / 
     A  
    /
  null <-- current Position
Run Code Online (Sandbox Code Playgroud)

所以一旦它到达节点A,A.left == null所以它会递归到node A(指定节点的值rootData)

     D
    / 
   B
  / 
 A  <-- current Position
Run Code Online (Sandbox Code Playgroud)

然后,它进入下一个递归调用, recurse(root.getRightChild());

         D
        / 
       B    
      / 
     A  
      \
      null <-- current Position
Run Code Online (Sandbox Code Playgroud)

而现在,由于leftrightA已经走过,控制将返回到节点B(即要求b.left = A),并会寻找B.right


以此堆栈为例,对于下面的树(节点,)

     A
    / \
   B   E 
  / \ / \
 C  D F 
Run Code Online (Sandbox Code Playgroud)

脚步 :

  • A调用它的左边B,所以A推入堆栈
  • B叫它左边C,所以B推入堆栈
  • C调用它的左边null,所以C推入堆栈
  • 现在C有两个leftrightas null...所以这标志着这个节点的递归结束,因此它pop从堆栈中取出
  • 现在,C完全遍历,因此,当B称为C时,控制返回到B并检查哪一行称为此命令
  • 作为b.left被执行,现在会去B.rightpushd ...... 和这样下去,这就是所谓的递归栈