我遇到了一个遍历的二叉搜索树函数,但无法解决。这是代码:
public void inOrderTraverseTree(Node focusNode){
if(focusNode != null){
inOrderTraverseTree(focusNode.leftChild);
System.out.println(focusNode);
inOrderTraverseTree(focusNode.rightChild);
}
}
假设有一个“两级”平衡二进制搜索树,这就是我对这种递归方法的理解:
从
root != null
-> inOrderTraverseTree(root.leftChild)
方法开始运行root.leftChild != null
-> inOrderTraverseTree(root.leftChild.leftChild)
方法正在运行但是,由于
root.leftChild
没有leftChild-> focusNode.leftChild == null
,因此if
循环将不会运行在这种情况下,这是否不意味着什么都不会打印?
但是据称它可以工作(https://www.youtube.com/watch?v=M6lYob8STMI)。谁能指出我哪里出问题了?
最佳答案
这里应用的逻辑:
检查焦点节点。如果为null
,则return
为父级的inOrderTraverseTree
。但是,由于在检查null之后没有任何反应,因此附加的return
语句与根本没有语句相同。
如果不是null
,则从(1)重复左子节点。
打印焦点节点的值。
从(1)重复右边的子节点。
从当前节点的inOrderTraverseTree
返回到父节点的inOrderTraverseTree
。
当然,如果焦点所在的节点是root
节点,则inOrderTraverseTree
会简单地返回到main
或首先调用它的方法。
例如,考虑下面的树:
A
/ \
B C
/ \ / \
D E F G
跟踪:
A->inOrderTraverseTree(left)
B->inOrderTraverseTree(left)
D->inOrderTraverseTree(left) //null, return to D
print(D)
D->inOrderTraverseTree(right) //null, return to D
return to B
print(B)
B->inOrderTraverseTree(right)
E->inOrderTraverseTree(left) //null, return to E
print(E)
E->inOrderTraverseTree(right) //null, return to E
return to B
return to A
print(A)
A->inOrderTraverseTree(right)
//Continue for the right subtree.