算法:二叉树的啮齿形层序遍历(蛇形遍历)

算法 大约 2145 字

示例

给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

    3
   / \
  9  20
    /  \
   15   7

返回

[
  [3],
  [20,9],
  [15,7]
]

思路

层序遍历时使用深度优先搜索递归方式遍历每一层,第1层从左往右,第2层从右往左,以此类推。只要递归传入层数(注意每玩下递归一次都+1),奇数层从尾部添加,偶数层从头部添加。

private List<List<Integer>> levelList = new ArrayList<>();

public void bfsR(Node root, int level) {
    if (root == null) {
        return;
    }
    if (level >= levelList.size()) {
        levelList.add(new ArrayList<>());
    }
    // %2 判断奇偶层
    if (level % 2 == 0) {//第奇数层(从1开始计算层高),从头部开始加
        levelList.get(level).add(root.id);
    } else { // 第偶数层,从尾部开始加
        levelList.get(level).add(0, root.id);
    }
    bfsR(root.left, level + 1);
    bfsR(root.right, level + 1);
}

完整代码

public class TreeZigzag {

    public static void main(String[] args) {
        TreeZigzag tree = new TreeZigzag();
        Node node3 = new Node(3);
        Node node9 = new Node(9);
        Node node20 = new Node(20);
        Node node15 = new Node(15);
        Node node7 = new Node(7);
        node3.left = node9;
        node3.right = node20;
        node20.left = node15;
        node20.right = node7;

        tree.root = node3;


        tree.bfsR(tree.root, 0);
        System.out.println(tree.levelList);
    }

    public Node root;

    private List<List<Integer>> levelList = new ArrayList<>();

    public void bfsR(Node root, int level) {
        if (root == null) {
            return;
        }
        if (level >= levelList.size()) {
            levelList.add(new ArrayList<>());
        }
        // %2 判断奇偶层
        if (level % 2 == 0) {//第奇数层(从1开始计算层高),从头部开始加
            levelList.get(level).add(root.id);
        } else { // 第偶数层,从尾部开始加
            levelList.get(level).add(0, root.id);
        }
        bfsR(root.left, level + 1);
        bfsR(root.right, level + 1);
    }


    private static class Node {
        public int id;
        public Node left;
        public Node right;

        public Node(int id) {
            this.id = id;
        }
    }
}

LeetCode 原题地址

https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal

阅读 76 · 发布于 2021-02-27

————        END        ————

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批