package tree;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Stack;
/**
* 给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
*/
public class p145 {
List<Integer> result=new ArrayList<>();
public List<Integer> postorderTraversal(TreeNode root) {
if(root==null)return result; //空树直接返回
//recursive(root); //递归
iterative(root); //迭代
return result;
}
//递归解
public void recursive(TreeNode treeNode){
if(treeNode==null)return;
recursive(treeNode.left);
recursive(treeNode.right);
result.add(treeNode.val);
}
//迭代
public void iterative(TreeNode root){
TreeNode node=root;
Stack<TreeNode> stack=new Stack<>();
HashMap<TreeNode,Boolean> map=new HashMap<>();
stack.push(root); //根节点入栈
map.put(node,true);
while(!stack.empty()) { //当栈不为空时进行迭代
node=stack.peek();
while(node.left!=null||node.right!=null){ //当不为叶子时遍历,每次查找一条遍历路径
if(node.left!=null&&!map.containsKey(node.left)){ //左子树不空且未被遍历过时
stack.push(node.left);
map.put(node.left,true);
node=node.left;
continue;
}
if(node.right!=null&&!map.containsKey(node.right)){ //右子树不空且未被遍历过时
stack.push(node.right);
map.put(node.right,true);
node=node.right;
}else{
break;
}
}
node=stack.pop(); //出栈
result.add(node.val); //添加到结果链表
}
}
public static void main(String argv[]){
p145 temp=new p145();
TreeNode root=new TreeNode(1);
root.right=new TreeNode(2);
root.right.left=new TreeNode(3);
for(Integer i:temp.postorderTraversal(root)){
System.out.println(i);
}
}
}