在二叉树中输入以下值({18, 26, 52, 78, 45, 16, 67, 58, 73, 11})时,您会收到此树:
PreOrder 和 InOrder 遍历都像我期望的那样工作。然而,当谈到 PostOrder (PO) 时,我收到的东西与我想象的不同。
据我了解,PO首先搜索左子树,然后搜索右子树,最后搜索节点(以根节点结尾)。
当通过这棵树在 PO 中遍历时,您最终会得到以下结果:{11, 16, 45, 58, 73, 67, 78, 52, 26, 18}。当写出这个结果背后的逻辑时,你会得到以下结果:从根开始,跟随完整的左,你最终在 11 这是你的第一个节点。之后,您上一层并获取其父级 (16)。你继续这样做直到你到达根(它不被包括在内,因为它不是一个leftChild)。一旦你通过了这个初始的左子树,你在右边向下一层并检查那里的 leftChilds。如果没有,你就往下一层,也就是我们找到 45 的地方。
此时我们有一个 {11, 16, 45} 的列表。我们继续这个并最终得到 58,这是我们在结果中的下一个值。这就是我困惑的地方:我们得到的下一个值是 73,与预期的 67 相反。为什么当找到另一个 leftChild(它的父级)时它会跳到 73?
以下代码负责遍历 PostOrder 中的树:
public void postorderTraversal(){
postorderHelper(root);
}
private void postorderHelper(Node node){
if(node != null){
postorderHelper(node.getLeftNode());
postorderHelper(node.getRightNode());
System.out.print(node.getData() + " ");
}
}
我猜这是因为值 73 的节点在 parentNode 之前处理(左右优先级),但为什么 45-52-78 三角形中不是这种情况呢?