Binary Tree Zigzag Level Order Traversal

Binary Tree Zigzag Level Order Traversal (leetcodelintcode)

Description
Given a binary tree, return the zigzag level order traversal of its nodes' values. 
(ie, from left to right, then right to left for the next level and alternate between).

Example
Given binary tree {3,9,20,#,#,15,7},
    3
   / \
  9  20
    /  \
   15   7

return its zigzag level order traversal as:
[
  [3],
  [20,9],
  [15,7]
]

解题思路

一、BFS(单队列)

和题目 Binary Tree Level Order Traversal 相比,不同在于相邻层结点的排列顺序相反,那么只需要设置一个标志,每到下一层时反转结点顺序即可。

Java 实现

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */
public
class
Solution
{

/**
     * 
@param
 root: The root of binary tree.
     * 
@return
: A list of lists of integer include 
     *          the zigzag level order traversal of its nodes' values 
     */
public
 ArrayList
<
ArrayList
<
Integer
>
>
 zigzagLevelOrder(TreeNode root) {

// write your code here

        ArrayList
<
ArrayList
<
Integer
>
>
 result = 
new
 ArrayList
<
ArrayList
<
Integer
>
>
();

if
 (root == 
null
) {

return
 result;
        }

        Queue
<
TreeNode
>
 queue = 
new
 LinkedList
<
TreeNode
>
();
        queue.offer(root);

// node_level用来记录当前处理的是哪一层根结点
int
 node_level = 
0
;

while
 (!queue.isEmpty()) {
            ArrayList
<
Integer
>
 level = 
new
 ArrayList
<
Integer
>
();

int
 size = queue.size();


for
 (
int
 i = 
0
; i 
<
 size; i++) {
                TreeNode head = queue.poll();
                level.add(head.val);


if
 (head.left != 
null
) {
                    queue.offer(head.left);
                }

if
 (head.right != 
null
) {
                    queue.offer(head.right);
                }
            }

// 结点在偶数层,按默认顺序记录;结点在奇数层,顺序反转后记录
if
 (node_level % 
2
 == 
0
) {
                result.add(level);
            } 
else
 {
                Collections.reverse(level);
                result.add(level);
            }
            node_level++;
        }

return
 result;
    }
}

二、BFS(两个栈)

也可以使用两个栈来实现,这里面的入栈顺序有一些小 trick。

Java 实现

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */
public
class
Solution
{

/**
     * 
@param
 root: The root of binary tree.
     * 
@return
: A list of lists of integer include 
     *          the zigzag level order traversal of its nodes' values 
     */
public
 ArrayList
<
ArrayList
<
Integer
>
>
 zigzagLevelOrder(TreeNode root) {

// write your code here

        ArrayList
<
ArrayList
<
Integer
>
>
 result = 
new
 ArrayList
<
ArrayList
<
Integer
>
>
();

if
 (root == 
null
) {

return
 result;
        }

// currLevel表示当前在处理的那一层的结点
// nextLevel表示下一层要处理的结点

        Stack
<
TreeNode
>
 currLevel = 
new
 Stack
<
TreeNode
>
();
        Stack
<
TreeNode
>
 nextLevel = 
new
 Stack
<
TreeNode
>
();
        Stack
<
TreeNode
>
 tmp;

        currLevel.push(root);

boolean
 normalOrder = 
true
;


while
 (!currLevel.isEmpty()) {
            ArrayList
<
Integer
>
 currLevelResult = 
new
 ArrayList
<
Integer
>
();


while
 (!currLevel.isEmpty()) {
                TreeNode node = currLevel.pop();
                currLevelResult.add(node.val);


if
 (normalOrder) {

if
 (node.left != 
null
) {
                        nextLevel.push(node.left);
                    }

if
 (node.right != 
null
) {
                        nextLevel.push(node.right);
                    }
                } 
else
 {

if
 (node.right != 
null
) {
                        nextLevel.push(node.right);
                    } 

if
 (node.left != 
null
) {
                        nextLevel.push(node.left);
                    }
                }
            }
            result.add(currLevelResult);

// 交换currLevel和nextLevel,currLevel代表将要处理的那一层结点

            tmp = currLevel;
            currLevel = nextLevel;
            nextLevel = tmp;

            normalOrder = !normalOrder;
        }

    }
}

参考

  1. Binary Tree Zigzag Level Order Traversal | 九章算法

results matching ""

    No results matching ""