二叉树 — 非递归实现先、中、后序

之前的文章中简单介绍过二叉树的数据结构和先、中、后序的不同实现方式。二叉树和递归序
其中先、中、后序三种方式都是由递归序转化而来,通过递归的方式遍历整棵二叉树,并通过到达每个节点第几次的次数,来达到先、中、后序的实现。
在那篇文章中,是通过递归的方式来实现的先、中、后序树的打印。这篇文章会通过改写递归,用普通的方法来通过先、中、后序的方式打印二叉树。

先序
使用栈的方式来实现,先进后出,如果右侧节点不为null,则先压入右侧节点。

public static void pre(Node head){
        if (head == null) {
            return;
        }
        Stack<Node> stack = new Stack();
        stack.add(head);
        while (!stack.isEmpty()) {
            Node cur = stack.pop();
            System.out.print(cur.val + " ");
            if (cur.right != null) {
                stack.push(cur.right);
            }
            if (cur.left != null) {
                stack.push(cur.left);
            }
        }
    }

后序
先将树按照 头 -》 右 -》 左的方式放入第一个栈中, 遍历第一个栈,并将弹出的元素依次放入第二个栈:此时第二个栈内的元素顺序就是 头 -》 右 -》左, 再遍历第二个栈,先进后出 ,遍历出来的顺序就是 左 -》 右 -》 头。以此来达到后序的目的。

 public static void pos1(Node head) {
        if (head != null) {
            Stack<Node> s1 = new Stack<>();
            Stack<Node> s2 = new Stack<>();
            s1.add(head);
            while (!s1.isEmpty()) {
                Node cur = s1.pop();
                s2.add(cur);
                if (cur.left != null) {
                    s1.push(cur.left);
                }
                if (cur.right != null) {
                    s1.push(cur.right);
                }
            }

            while (!s2.isEmpty()){
                System.out.print(s2.pop().val + " ");
            }
            System.out.println();
        }
    }

中序
中序照比先序和后续复杂些,整体思路是这样:
先将整棵二叉树全部按照左树进行划分,当前节点如果有左子节点,则将当前节点压栈,并将当前节点等于左子节点,将左子节点全部压栈。直到左子节点为null,左子节点为null后直接从栈中弹出元素,并将当前节点等于右子节点,如果右子节点还有左树,则继续压栈,没有则直接弹出。

public static void in(Node head){
        if (head != null){
            Stack<Node> stack = new Stack<>();
            while (!stack.isEmpty() || head != null){
                if (head != null){
                    stack.add(head);
                    head = head.left;
                }else{
                    head = stack.pop();
                    System.out.print(head.val + " ");
                    head = head.right;
                }
            }
            System.out.println();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值