题意:二叉树的后续遍历
这里先使用递归的形式实现,以后再数据结构中补上非递归实现,对边界条件的处理要想好!
public ArrayList<Integer> postorderTraversal(TreeNode root) {
if(root == null) return new ArrayList<Integer>();
ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList<Integer> leftList = postorderTraversal(root.left);
ArrayList<Integer> rightList = postorderTraversal(root.right);
if(leftList.size() > 0){
list.addAll(leftList);
}
if(rightList.size() > 0){
list.addAll(rightList);
}
list.add(root.val);
return list;
}
二叉树的后序遍历,非递归实现:
将根节点存入stack中,在stack中取top节点,若它无子节点则遍历它;
若有子节点且pre表示的前一个遍历节点是它的子节点,则表示子节点已经遍历完毕,可以遍历它;
public ArrayList<Integer> postorderTraversal(TreeNode root) {
ArrayList<Integer> list = new ArrayList<Integer>();
Stack<TreeNode> s = new Stack<TreeNode>();
TreeNode pre = null;
if(root != null) s.push(root);
while(!s.isEmpty()){
TreeNode t = s.lastElement();
boolean flag1 = (t.left == null) && (t.right == null);
boolean flag2 = (pre != null) && (pre == t.left || pre == t.right);
if(flag1 || flag2){
list.add(t.val);
s.pop();
pre = t;
}
else{
if(t.right != null) s.push(t.right);
if(t.left != null) s.push(t.left);
}
}
return list;
}