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);
        }

    }
}