zoukankan      html  css  js  c++  java
  • 二叉树后序遍历--递归与非递归实现

    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);
            }
    
        }
    }
  • 相关阅读:
    2013面试C++小结
    Linux C 面试题总结 .
    [SCOI2011]糖果
    python——简单爬虫
    python——ADSL拨号程序
    python——处理xls表格
    Vsphere初试——架设Panabit行为管理
    Vsphere初试——使用Vsphere client
    Vsphere初试——基本安装
    Python2与Python3的不同点
  • 原文地址:https://www.cnblogs.com/ming-szu/p/9031059.html
Copyright © 2011-2022 走看看