遍历思路:左右根,第三次经过该节点时进行打印,即右边回溯时
首先第一一棵二叉树,如图
后序遍历的压栈和出栈逻辑。节点1压入栈中,不能打印节点1,接着压入节点2也不能打印,此时压入节点4、压入节点4的左右空节点、随后分别弹出栈,此时回溯到节点4,是第三次出现需要打印继续回溯到节点2,此时是第二次经过节点2,不能打印,然后把节点5压入栈中,不能打印、压入节点6,不能打印;压入左边空节点回溯节点6不能打印,压入右边空节点回溯节点6,此时第三次经过节点6需要打印,依据此逻辑依次类推。

最终得出的一个遍历输出顺序应为

算法代码实现
节点定义类
package com.hx;
/**
* 二叉树节点对象类
*/
public class TreeNode {
public TreeNode left;//左节点
public TreeNode right;//右节点
public int val; //节点值
public int deep; //树深度
public TreeNode(TreeNode left, TreeNode right) {
this.left = left;
this.right = right;
}
public TreeNode(int val, TreeNode left, TreeNode right) {
this.left = left;
this.right = right;
this.val = val;
}
}
算法实现类
package com.hx;
public class BinaryTree {
/**
* 二叉树遍历-后序遍历递归
* @param root
*/
public static void postorder(TreeNode root) {
if(root == null) {
return;
}
postorder(root.left);
postorder(root.right);
System.out.println(root.val);//第三次成为栈顶的元素即打印
}
public static void main(String[] args) {
TreeNode node7 = new TreeNode(7,null, null);
TreeNode node6 = new TreeNode(6,null, null);
TreeNode node5 = new TreeNode(5,node6, node7);
TreeNode node4 = new TreeNode(4,null, null);
TreeNode node3 = new TreeNode(3,null, null);
TreeNode node2 = new TreeNode(2,node4, node5);
TreeNode node1 = new TreeNode(1,node2, node3);
postorder(node1);
}
}
执行结果

4852

被折叠的 条评论
为什么被折叠?



