二叉树的后序遍历
public static ArrayList<Integer> postorderTraversal(TreeNode root) {
//非空判断
if(root == null){
return new ArrayList<Integer>();
}
//栈 后进先出
Stack<TreeNode> stack = new Stack<TreeNode>();
//返回值
ArrayList<Integer> list = new ArrayList<Integer>();
//上一个处理的节点
TreeNode pre = new TreeNode();
stack.push(root);
while(!stack.isEmpty()) {
//查看栈顶元素
TreeNode t = stack.peek();
//左孩子为空,右孩子为空,则为叶子节点;或上一个处理节点是当前节点的左孩子或右孩子
if((t.left == null && t.right == null)||(pre != null && (t.left == pre || t.right == pre))) {
list.add(t.val);
pre = t;
stack.pop();
}else {
//先右孩子入栈再左孩子入栈
if(t.right != null) {
stack.push(t.right);
}
if(t.left!=null) {
stack.push(t.left);
}
}
}
return list;
}
上面的是非递归解法,主要用的是栈,后进先出的特点。
节点类:
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
}

浙公网安备 33010602011771号