二叉树的前、中、后序遍历统一写法

参考

  1. 帮你对二叉树不再迷茫,彻底吃透前中后序递归法(递归三部曲)和迭代法(不统一写法与统一写法)
  2. 二叉树的前、中、后序遍历(递归与非递归)

算法

通过插入标志符,来标记需要输出哪个元素。

  1. 确定输出顺序。首次遍历结点A时,将A和其左右子结点按照遍历顺序插入到栈中,A结点后需要插入标志符。
  2. 输出结点元素。如果当前栈顶元素是标志符,说明A结点该输出了,输出A结点即可。

参考博文1中,用null作为标志符,这在要求输出空结点时不可行,标志符和空结点会发生冲突。要解决冲突,只需自定义标识符即可,详见下述代码。如果空结点需要区分左空结点和右空结点,可以再自定义两个标识符来处理。

前序遍历

public void preOrderTraverse3(ListNode<String> root) {
        System.out.println("前根遍历-非递归");
        Stack<ListNode<String>> stack = new Stack<>();
        stack.push(root);
        ListNode<String> cur;
        ListNode<String> flag = new ListNode<>("0");//标识符
        while (!stack.isEmpty()) {
            cur = stack.pop();
            if (cur == null) {
                System.out.printf("^");
            } else if (cur == flag) {
                cur = stack.pop();
                System.out.printf(cur.val);
            } else {
                stack.push(cur.right);//右
                stack.push(cur.left);//左
                stack.push(cur);//中
                stack.push(flag);
            }

        }

        System.out.printf("\n");

    }

中序遍历

public void inOrderTraverse3(ListNode<String> root) {
        System.out.println("中根遍历-非递归");
        Stack<ListNode<String>> stack = new Stack<>();
        stack.push(root);
        ListNode<String> cur;
        ListNode<String> flag = new ListNode<>("0");//标识符
        while (!stack.isEmpty()) {
            cur = stack.pop();
            if (cur == null) {
                System.out.printf("^");
            } else if (cur == flag) {
                cur = stack.pop();
                System.out.printf(cur.val);
            } else {
                stack.push(cur.right);//右
                stack.push(cur);//中
                stack.push(flag);
                stack.push(cur.left);//左
            }

        }

        System.out.printf("\n");

    }

后序遍历

public void postOrderTraverse3(ListNode<String> root) {
        System.out.println("后根遍历-非递归");
        Stack<ListNode<String>> stack = new Stack<>();
        stack.push(root);
        ListNode<String> cur;
        ListNode<String> flag = new ListNode<>("0");//标识符
        while (!stack.isEmpty()) {
            cur = stack.pop();
            if (cur == null) {
                System.out.printf("^");
            } else if (cur == flag) {
                cur = stack.pop();
                System.out.printf(cur.val);
            } else {
                stack.push(cur);//中
                stack.push(flag);
                stack.push(cur.right);//右
                stack.push(cur.left);//左
            }

        }

        System.out.printf("\n");

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xxaxtt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值