二叉树的后序遍历
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; }