zoukankan      html  css  js  c++  java
  • 【数据结构】算法 Binary Tree Postorder Traversal 二叉树后序遍历

    Binary Tree Postorder Traversal 二叉树后序遍历

    后序遍历是啥就不说了,百度一下, 简单说就是 left_child->right_child->root.

    Input: root = [1,null,2,3]
    Output: [3,2,1]
    
    

    思路

    递归处理

     /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode() {}
     *     TreeNode(int val) { this.val = val; }
     *     TreeNode(int val, TreeNode left, TreeNode right) {
     *         this.val = val;
     *         this.left = left;
     *         this.right = right;
     *     }
     * }
     */
    class Solution {
        public List<Integer> list = new ArrayList<>();
        public List<Integer> postorderTraversal(TreeNode root) {
            if(root==null){
                return list;
            }
    
             postorderTraversal(root.left);
             postorderTraversal(root.right);
            list.add(root.val);
             return list;
        }
    }
    

    非递归的方式

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode() {}
     *     TreeNode(int val) { this.val = val; }
     *     TreeNode(int val, TreeNode left, TreeNode right) {
     *         this.val = val;
     *         this.left = left;
     *         this.right = right;
     *     }
     * }
     */
    class Solution {
        public List<Integer> postorderTraversal(TreeNode root) {
            List<Integer> ans =new ArrayList<>();
            Stack<Integer> s2 = new Stack<Integer>();//记录遍历方向
            Stack<TreeNode> s1 = new Stack<TreeNode>();//记录treenode轨迹
            if(root==null){
                return ans;
            }
            s1.push(root);
            s2.push(0);
            while(!s1.isEmpty()){
                root = s1.peek();
                int status = s2.pop();
                switch (status){
                    case 0://左
                        s2.push(1);
                        if(root.left!=null){
                            s1.push(root.left);
                            s2.push(0);
                        }
                        break;
                    case 1://右
                        s2.push(2);
                        if(root.right!=null){
                            s1.push(root.right);
                            s2.push(0);
                        }
                        break;
                    case 2://root
                        ans.add(s1.peek().val);
                        s1.pop();
                }
            }
            return ans;
        }
    }
    

    Tag

    stack

  • 相关阅读:
    【centos6.5 安装 node.js + npm】
    【钉钉PC】PC端钉钉清除缓存
    【laravel5.4】中jquery的post Ajax提交
    python 设计模式之中介者模式
    python 设计模式之备忘录模式
    python 设计模式之观察者模式
    python 设计模式之策略模式
    23种设计模式有哪些,不带定义,不带例子
    python 设计模式之模板方法模式
    python 设计模式之访问者模式
  • 原文地址:https://www.cnblogs.com/dreamtaker/p/14605417.html
Copyright © 2011-2022 走看看