题目:
Given a binary tree, return the postorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 2 / 3
return [3,2,1]
.
题意及分析:后序遍历,先遍历左子节点,然后右子节点,最后才遍历该点。这里对于任意一个节点,如果当前点没有子节点或者 已经访问过存在的子节点,那么可以直接访问该点,并输出该点的值;否则访问该点的子节点。如果用一个栈来实现,那么先从根节点起遍历,如果节点无左右子树或者已经访问过那么直接输出节点的值,否则将该点的右子节点和左子节点先后加入栈中,这样就可以保证先输出左子节点后输出右子节点。
代码:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); Stack<TreeNode> stack=new Stack<>(); stack.push(root); TreeNode preNode=null; while(!stack.isEmpty()&&root!=null){ root=stack.peek(); //得到栈顶的点 //如果当前节点没有子节点 或者 当前节点的左右子树都被访问,那么可以直接输出该点的值并从栈中弹出该点 if((root.left==null&&root.right==null)||(preNode!=null&&(root.left==preNode||root.right==preNode))){ root=stack.pop(); res.add(root.val); preNode=root; }else{ //同时访问该点的右子节点和左子节点,保证先输出左后输出右 if(root.right!=null){ stack.push(root.right); } if(root.left!=null){ stack.push(root.left); } } } return res; } }
方法二:
public ArrayList<Integer> postorderTraversal(TreeNode root) { //使用非递归实现后序遍历 ArrayList<Integer> result = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); TreeNode node = root; while(!stack.isEmpty() || node !=null){ if(node!=null){ //入栈的时候添加 stack.push(node); result.add(node.val); node = node.right; }else{ node=stack.pop(); node=node.left; } } Collections.reverse(result); return result; }