0103. Binary Tree Zigzag Level Order Traversal

103. 二叉树的锯齿形层次遍历 #

Difficulty: 中等

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

例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回锯齿形层次遍历如下:

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

题解 #

题解一:BFS(广度优先遍历) #

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        if (root == null) {
            return result;
        }
        Deque<TreeNode> queue = new LinkedList<>();
        queue.addLast(root);
        queue.addLast(null);
        LinkedList<Integer> levelList = new LinkedList<>();
        boolean isOrderLeft = true;
        while (queue.size() > 0) {
            TreeNode currentNode = queue.pollFirst();
            if (currentNode != null) {
                if (isOrderLeft) {
                    levelList.addLast(currentNode.val);
                } else {
                    levelList.addFirst(currentNode.val);
                }

                if (currentNode.left != null) {
                    queue.addLast(currentNode.left);
                }
                if (currentNode.right != null) {
                    queue.addLast(currentNode.right);
                } 
            } else {
                result.add(levelList);
                levelList = new LinkedList<>();
                if (queue.size() > 0) {
                    queue.addLast(null);
                }
                isOrderLeft = !isOrderLeft;
            }
        }
        return result;
    }
}

复杂度分析 #

  • 时间复杂度:O(N),其中 N 是树中节点的数量。

  • 空间复杂度:O(N),其中 N 是树中节点的数量。

解法二:DFS (深度优先遍历) #

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
  protected void DFS(TreeNode node, int level, List<List<Integer>> results) {
    if (level >= results.size()) {
      LinkedList<Integer> newLevel = new LinkedList<Integer>();
      newLevel.add(node.val);
      results.add(newLevel);
    } else {
      if (level % 2 == 0)
        results.get(level).add(node.val);
      else
        results.get(level).add(0, node.val);
    }

    if (node.left != null) DFS(node.left, level + 1, results);
    if (node.right != null) DFS(node.right, level + 1, results);
  }

  public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
    if (root == null) {
      return new ArrayList<List<Integer>>();
    }
    List<List<Integer>> results = new ArrayList<List<Integer>>();
    DFS(root, 0, results);
    return results;
  }
}

复杂度分析 #

  • 时间复杂度:O(N),其中 N 是树中节点的数量。

  • 空间复杂度:O(H),其中 H 是树的高度。

Calendar Dec 1, 2020
Edit Edit this page
本站总访问量:  次 您是本站第  位访问者