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

题目描述

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

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

    3
   / \
  9  20
    /  \
   15   7

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

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

解题思路

考虑到题目需要用折线得方式遍历,就是说在遍历的过程中需要有反向操作,可以联想到使用栈来实现。

双栈法

  1. 建立两个栈stack1stack2
  2. 把二叉树的根节点pushstack1
  3. 使用一个while循环,pop当前节点的子结点,然后push进另一个栈,这样每处理一个栈,就在最终结果ans里面加一个列表(当前深度的节点)

源代码

public List<List<Integer>> zigzagLevelOrder (TreeNode root) {
    List<List<Integer>> ans = new ArrayList<List<Integer>>();
    if (root== null) return ans;
    Stack<TreeNode> stack1 = new Stack<>();
    Stack<TreeNode> stack2 = new Stack<>();
    TreeNode cur = root;
    stack1.push(cur);
    while (!stack1.isEmpty() || !stack2.isEmpty()) {
        List<Integer> temp = new ArrayList<>();
        while (!stack1.isEmpty()) {
            cur = stack1.pop();
            temp.add(cur.val);
            if (cur.left !=null) stack2.push(cur.left);
            if (cur.right !=null) stack2.push(cur.right);
        }
        ans.add(temp);
        temp = new ArrayList<>();
        while (!stack2.isEmpty()) {
            cur = stack2.pop();
            temp.add(cur.val);
            if (cur.right !=null) stack1.push(cur.right);
            if (cur.left !=null) stack1.push(cur.left);
        }
        if (!temp.isEmpty()) {
            ans.add(temp);
        }
    }
    return ans;
}

心得体会

一开始只用了一个栈和一个列表来实现,怎么也调不通,后来参考了讨论区的解答,使用双栈,豁然开朗。


 上一篇
105-从前序与中序遍历序列构造二叉树 105-从前序与中序遍历序列构造二叉树
题目描述根据一棵树的前序遍历与中序遍历构造二叉树。 注意:你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树:
2019-01-14
下一篇 
334-递增的三元子序列 334-递增的三元子序列
题目描述给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。 数学表达式如下: 如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,使得 arr[i] < arr[j]
2019-01-08
  目录