天天看點

二叉樹的鋸齒形層次周遊(BFS實作)

題目

給你一個二叉樹,請你傳回其按 層序周遊 得到的節點值。 (即逐層地,從左到右通路所有節點)。

示例:

二叉樹:[3,9,20,null,null,15,7]

二叉樹的鋸齒形層次周遊(BFS實作)

傳回其層次周遊結果:

二叉樹的鋸齒形層次周遊(BFS實作)

注意點

參考1:二叉樹的層序周遊(BFS實作)

參考2:二叉樹的層次周遊Ⅱ(BFS實作)

1、該題是以上兩道題的綜合,根據不同情況采取不同的操作;

  • 向左周遊,使用尾插法;
  • 向右周遊,使用頭插法。

實作

public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> result = new LinkedList<>();
        // 是否向左周遊(反向),預設為向右周遊
        boolean orderLeft = false;

        if (root == null) {
            return result;
        }

		// 隊列用于存放每一層的節點
        Queue<TreeNode> queue = new ArrayDeque<>();
        // 第一層隻有根節點
        queue.add(root);

		//周遊二叉樹
        while (!queue.isEmpty()) {
        	// 每一層的結果
            LinkedList<Integer> level = new LinkedList<>();
            // 每一層節點數
            int queueSize = queue.size();

			//周遊每一層
            for (int i = 0; i < queueSize; i ++) {
            	// 目前節點
                TreeNode curNode = queue.poll();
                // 目前節點值
                int curNodeVal = curNode.val;
				
				//判斷周遊方向
                if (orderLeft) {
                	// 向左周遊,使用尾插法
                    level.addFirst(curNodeVal);
                } else {
                	// 向右周遊,使用頭插法
                    level.addLast(curNodeVal);
                }

				// 判斷是否存在左節點
                if (curNode.left != null) {
                    queue.add(curNode.left);
                }

				// 判斷是否存在右節點
                if (curNode.right != null) {
                    queue.add(curNode.right);
                }
            }
            
            result.add(level);
            // 反向
            orderLeft = !orderLeft;
        }
        return result;
    }