• 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;
        }
    }
    苟有恒,何必三更眠五更起;最无益,莫过一日暴十日寒。
  • 相关阅读:
    超简单tensorflow入门优化程序&&tensorboard可视化
    tf.random_normal()函数
    tensorflow中创建多个计算图(Graph)
    tensorflow中有向图(计算图、Graph)、上下文环境(Session)和执行流程
    配置错误 在唯一密钥属性“fileExtension”设置为“.log”时,无法添加类型为“mimeMap”的重复集合项
    取奇偶数
    DNS添加/修改/查询/删除A记录
    IE自动化
    Get-ChildItem参数之 -Exclude,Filter,Recurse应用
    自动下载
  • 原文地址:https://www.cnblogs.com/shaer/p/10671159.html
Copyright © 2020-2023  润新知