【LeetCode】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;
}

心得体会

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

posted @ 2019-01-11 13:20  yuzhenzero  阅读(103)  评论(0编辑  收藏  举报