实现二叉树的 先序, 中序, 后序遍历(非递归)

借助栈来实现二叉树的先序后序遍历, 栈的特点是先进后出。

二叉树的先序遍历:

public class Num144_PreOrderNonRecursion {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> ret = new ArrayList<>();
        if (root==null)
        {
            return ret;
        }
        Deque<TreeNode> stack=new ArrayDeque<>();
        stack.push(root);
        while (!stack.isEmpty())
        {
            TreeNode cur=stack.pop();
            ret.add(cur.val);
            if (cur.right!=null)
            {
                stack.add(cur.right);
            }
            if (cur.left!=null)
            {
                stack.add(cur.left);
            }
        }
        return ret;
    }
}

 

中序遍历:

public class Num94_InOrderNonRecursion {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ret = new ArrayList<>();
        if (root == null) {
            return ret;
        }
        Deque<TreeNode> stack = new ArrayDeque<>();
        TreeNode cur = root;
        while (!stack.isEmpty()||cur!=null) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            //cur为空,走到了空结点,栈顶存放最左侧的结点
            cur = stack.poll();
            ret.add(cur.val);
            cur = cur.right;
        }
        return ret;
    }
}

后序遍历:

public class Num145_PostOrderNonRecursion {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> ret=new ArrayList<>();
        if (root==null)
        {
            return ret;
        }
        TreeNode cur=root;
        //被处理过的结点
        TreeNode prev=null;
        Deque<TreeNode> stack=new ArrayDeque<>();
        while (!stack.isEmpty()||cur!=null)
        {
            while (cur!=null)
            {
                stack.push(cur);
                cur=cur.left;
            }
            //左树为空,cur为栈顶结点
            cur=stack.pop();
            if (cur.right==null||prev==cur.right)
            {
                ret.add(cur.val);
                prev=cur;
                cur=null;
            }
            else
            //右数不为空,且没有被处理过
            {
                stack.push(cur);
                cur=cur.right;

            }
        }
        return ret;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值