• 145. Binary Tree Postorder Traversal(非递归实现二叉树的后序遍历)


    Given a binary tree, return the postorder traversal of its nodes' values.

    Example:

    Input: [1,null,2,3]
       1
        
         2
        /
       3
    
    Output: [3,2,1]
    

    Follow up: Recursive solution is trivial, could you do it iteratively? 

    方法一:递归

    class Solution {
        public void preorderTraversal(TreeNode root) {
            if(root==null) return ;
            preorderTraversal(root.left);
            preorderTraversal(root.right);
            System.out.print(root.val+' ');
        }
    }

    方法二:用两个栈实现

    根据根结点将左右孩子加入栈中这种操作程序比较好实现。用一个栈做中转,另一栈存最终结果的逆序数。

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public List<Integer> postorderTraversal(TreeNode root) {
            Stack<TreeNode> stack1=new Stack<TreeNode>();
            Stack<TreeNode> stack2=new Stack<TreeNode>();
            List<Integer> list=new ArrayList<Integer>();
            if(root==null) return list;
            stack1.push(root);
            while (!stack1.isEmpty()){
                root=stack1.pop();
                stack2.push(root);
                if(root.left!=null)
                    stack1.push(root.left);
                if(root.right!=null)
                    stack1.push(root.right);
            }
            while (!stack2.isEmpty()){
                list.add(stack2.pop().val);
            }
            return list;
        }
    }

    方法三:用一个栈实现

    想法还是从后续遍历的概念而来,后续遍历:左右根。要先找到最左边的叶子结点,找到了之后弹出。然后找对应的右叶子结点。找到后弹出。

    当栈不为空时,栈顶元素有三种情况,有左孩子且未被弹出,那就压入栈,有右孩子且未被弹出,那就压入栈。没有左右孩子或者左右孩子已被弹出,那就弹出这个结点(因为根结点总是在孩子之后弹出的)。

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public List<Integer> postorderTraversal(TreeNode root) {
            Stack<TreeNode> stack=new Stack<TreeNode>();
            List<Integer> list=new ArrayList<Integer>();
            if(root==null) return list;
            TreeNode c=null;
            stack.push(root);
            while (!stack.isEmpty()){
                c=stack.peek();
                if(c.left!=null&&c.left!=root&&c.right!=root){
                    stack.push(c.left);
                }else if(c.right!=null&&c.right!=root){
                    stack.push(c.right);
                }else { 
                    list.add(stack.pop().val);
                    root=c;
                }
            }
            return list;
        }
    }
    苟有恒,何必三更眠五更起;最无益,莫过一日暴十日寒。
  • 相关阅读:
    J2EE系列 (一) 几个技术规范
    MyEclipse 10 优化技巧
    J2EE (二) Servlet设置Session Cookies
    CSS 外层box自动计算高度的问题
    UI设计技巧Div封闭式Div导致页面显示异常
    Windows 7 IIS7 无法启动, 显示WAS & W3SVC没有启动的错误提示
    Windows 7 截图
    GridView技巧增加序号列
    ERWin & ERStudio图里的实线和虚线的含义
    [转]CSS布局口诀 CSS BUG顺口溜
  • 原文地址:https://www.cnblogs.com/shaer/p/10671159.html
Copyright © 2020-2023  润新知