原始题目如下,意为后序遍历二叉树,不要用递归。
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]
.
Note: Recursive solution is trivial, could you do it iteratively?
后序遍历略微复杂,有两种方法:1,使用额外堆栈,记录节点的右孩子是否访问过;2,将“前序遍历”(中、右、左),然后逆序输出即为后序遍历。两种方法源代码如下:
import java.util.ArrayDeque;
import java.util.LinkedList;
import java.util.List;
public class Solution {
public static List<Integer> postorderTraversal(TreeNode root){
ArrayDeque<TreeNode> stack = new ArrayDeque<TreeNode>();
List<Integer> a = new LinkedList<Integer>();
List<Integer> b = new LinkedList<Integer>();
TreeNode tmp = null;
if(root == null){
return a;
}
else{
stack.add(root);
while(!stack.isEmpty()){
tmp = stack.removeLast();
a.add(tmp.val);
if(tmp.left != null)
stack.add(tmp.left);
if(tmp.right != null)
stack.add(tmp.right);
}
for(int i = a.size()-1 ; i >= 0; i --)
b.add(a.get(i));
return b;
}
}
}
import java.util.ArrayDeque;
import java.util.LinkedList;
import java.util.List;
public class Solution {
public static List<Integer> postorderTraversal(TreeNode root){
ArrayDeque<TreeNode> stack = new ArrayDeque<TreeNode>();
ArrayDeque<TreeNode> flag = new ArrayDeque<TreeNode>();//Node in this stack, its right child had been visited
List<Integer> a = new LinkedList<Integer>();
TreeNode tmp = null;
if(root == null){
return a;
}
else{
stack.add(root);
while(stack.peekLast().left != null){
stack.add(stack.peekLast().left);
}
while(!stack.isEmpty()){
if(stack.peekLast().right == null){//
tmp = stack.removeLast();
a.add(tmp.val);
}
else if(!flag.isEmpty() && stack.peekLast().equals(flag.peekLast())){
// its right child had been visited
tmp = stack.removeLast();
a.add(tmp.val);
flag.removeLast();
}
else{//it has right child and the right child had not been visited
tmp = stack.peekLast();
stack.add(stack.peekLast().right);
flag.add(tmp);
tmp = stack.peekLast();
while(tmp.left != null){
stack.add(tmp.left);
tmp = tmp.left;
}
}
}
return a;
}
}
public static void main(String args[]){
List<Integer> c = new LinkedList<Integer>();
TreeNode p = new TreeNode(1);
TreeNode p2 = new TreeNode(2);
TreeNode p3 = new TreeNode(3);
TreeNode p4 = new TreeNode(4);
TreeNode p5 = new TreeNode(5);
TreeNode p6 = new TreeNode(6);
TreeNode p7 = new TreeNode(7);
p.left = p2;
p.right = p5;
p2.left = p3;
p2.right = p4;
p3.left = null;
p3.right = null;
p4.left = null;
p4.right = null;
p5.left = null;
p5.right = null;
c = postorderTraversal(p);
for(int i = 0; i < c.size(); i ++ ){
System.out.println(c.get(i));
}
}
}