二叉树的后序遍历相比较前序和中序复杂一些。我们需要一个标记来记忆我们此时节点上一个节点。
具体的java代码如下:
// 二叉树的后序遍历
public static void postOrderTraverWithStack(TreeNode node){
Stack<TreeNode> stack = new Stack<>();
TreeNode treeNode = node;
// 标记位
TreeNode lastVisit = null;
while(treeNode != null || !stack.isEmpty()){
while(treeNode != null){
stack.push(treeNode);
treeNode = treeNode.leftChild;
}
// 栈不为空
if(!stack.isEmpty()){
// 出栈
treeNode = stack.pop();
/***
* 这块就是判断treeNode是否有右孩子,
* 如果没有输出treeNode.data, 让lastVisit指向treeNode, 并让treeNode为空
* 如果有右孩子, 将当前节点继续入栈,treeNode指向它的有孩子,继续重复循环
*/
// 这里其实是访问到根节点后有两条路径,一个是当没有右孩子或者右孩子被访问过后,
// 打印根节点,另一个是右孩子没有被访问过,则把该根节点继续压入栈,访问右孩子。
if(treeNode.rightChild == null || treeNode.rightChild == lastVisit){
System.out.print(treeNode.data + " ");
lastVisit = treeNode;
treeNode = null;
}
else{
stack.push(treeNode);
treeNode = treeNode.rightChild;
}
}
}
}
来源:CSDN
作者:Karate_Y
链接:https://blog.csdn.net/qq_39846523/article/details/104466779