【每日一题】二叉树的前中后序非递归整理

本文整理并介绍二叉树的三种遍历所使用的数据结构和遍历方式。

一、前序遍历

题目描述:给定一个二叉树,返回它的 前序 遍历。
在这里插入图片描述
递归很简单,要求用非递归实现。

思路: 栈,遍历时先存放右节点,再存放左节点,能够保证遍历到的是前序序列。

public List<Integer> preorderTraversal(TreeNode root) {
        LinkedList<TreeNode> stack = new LinkedList<>();
        List<Integer> list = new ArrayList<>();
        if(root == null)
            return list;
        stack.addLast(root);
        while(!stack.isEmpty()){
            TreeNode temp = stack.removeLast();
            list.add(temp.val);
            if(temp.right != null){ //栈中先存放右节点
                stack.addLast(temp.right);
            }
            if(temp.left != null){ //再存放左节点
                stack.addLast(temp.left);
            }
        }
        return list;
    }

二、中序遍历

题目描述:给定一个二叉树,返回它的中序 遍历。
在这里插入图片描述
递归算法很简单,你可以通过迭代算法完成吗?

思路:栈,依次遍历左节点存放到栈中,然后当前节点为空时弹栈,再遍历右节点。

 //中序遍历:左根右
   public List<Integer> inorderTraversal(TreeNode root){
        Stack<TreeNode> stack = new Stack<>();
        List<Integer> list = new ArrayList<>();
        TreeNode cur = root;
        //循环结束的标记为cur为空,并且栈为空
        while(cur != null || !stack.isEmpty()){
            while(cur != null){
                stack.add(cur);
                cur = cur.left; //先遍历左节点
            }
            TreeNode temp = stack.pop();//再操作根节点
            list.add(temp.val);
            cur = temp.right;//再遍历右节点
        }
        return list;
    }

三、后序遍历

题目描述:给定一个二叉树,返回它的后序 遍历。
在这里插入图片描述
递归算法很简单,你可以通过迭代算法完成吗?
思路: 栈+双向链表(逆向插入)
非递归:栈中先入左节点,后入右节点,弹出时先弹右节点;插入链表后要倒序一遍,可以直接每次都插在最前面
左右根的后序遍历,采用逆向思维,每次存放都存在最左边
每从栈中弹一个就存到list的最前边
先存根节点,然后左节点入栈,再右节点入栈,弹出时先弹右节点

/**
    * 非递归:栈中先入左节点,后入右节点,弹出时先弹右节点;插入链表后要倒序一遍,可以直接每次都插在最前面
    *  左右根的后序输出,采用逆向思维,存放时顺序为根右左,只不过每次存放都存在最左边
    * 每从栈中弹一个就存到list的最前边
    * 先存根节点,然后左节点入栈,再右节点入栈,弹出时先弹右节点
    * 
    */
    public List<Integer> postorderTraversal(TreeNode root) {
        LinkedList<TreeNode> stack = new LinkedList<TreeNode>();
        //结果集采用双向链表,在存放值的时候存放在最左边
        LinkedList<Integer> output = new LinkedList<>();
        if(root == null)
            return output;
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode temp = stack.pop();
            output.addFirst(temp.val); //存值到最前边,不用倒序翻转了
            if(temp.left != null)
                stack.push(temp.left);
            if(temp.right != null)
                stack.push(temp.right);
        }
        return output;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值