码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树后序遍历--递归与非递归实现

时间:2018-05-13 10:40:06      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:简单   contain   null   roo   system   添加   contains   res   bre   

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

    }
}

 

二叉树后序遍历--递归与非递归实现

标签:简单   contain   null   roo   system   添加   contains   res   bre   

原文地址:https://www.cnblogs.com/ming-szu/p/9031059.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!