之字形遍历树

搜索树有两种方式,一种的bfs(广度优先搜索)一种是dfs(深度优先搜索),而之字形遍历属层次搜索,可通过改写bfs来实现。之字形的特点是一行正序则下一行倒序,循环下去。

如上图,我们的遍历顺序应该是 1-》3->2-》4->5->6-》10->9->8->7,而倒序我们可以通过栈先进后出的特性来实现。

基本思路是用栈来存储我们当前遍历层次的孩子节点。比如说当前我们遍历到第一行,节点有1,那么我们将它的子节点2和3按从左到右顺序存入栈s1中,当第一行遍历完后我们开始遍历第二行可通过s的pop方法输出,则顺序为3->2。而在遍历第二行的时候我们也要存贮他们的子节点用于下层遍历,第三行的输出顺序应该为正序所以我们要倒着存入栈中。并且,正好第二层是倒着遍历的,只是子节点入栈顺序不再是从左到右而是从右到左(不难想吧)。

所以,规律就是奇数行子节点入栈顺序是先左子节点后右子节点,偶数行的话子节点入栈顺序就是先右子节点后左子节点,两种情况代码都差不多。

代码如下

public static void f(Node header) {
    Stack<Node> s1 = new Stack<>();
    s1.push(header);
    Stack<Node> s2 = new Stack<>();
    //用于标记是奇数行还是偶数行
    int index = 1;
    while (!s1.isEmpty() || !s2.isEmpty()) {
        if (index % 2 != 0) {
            //存储遍历结果,方便看每行结果。。。。
            List<Integer> list = new ArrayList<>();
            while (!s1.isEmpty()) {
                Node temp = s1.pop();
                if (temp != null) {
                    list.add(temp.val);
                    //先左后右
                    s2.push(temp.left);
                    s2.push(temp.right);
                }

            }
            if (list.size() > 0) {
                System.out.println(list);
                index++;
            }
        } else {
            List<Integer> list = new ArrayList<>();
            while (!s2.isEmpty()) {
                Node temp = s2.pop();
                if (temp != null) {
                    list.add(temp.val);
                    //先右后左
                    s1.push(temp.right);
                    s1.push(temp.left);
                }

            }
            if (list.size() > 0) {
                System.out.println(list);
                index++;
            }
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值