leetcode103.二叉树的锯齿形层次遍历
题目
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
返回锯齿形层次遍历如下:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal
思路
-
普通的层序遍历是每层都从左往右遍历,建一个队列然后把每个结点的左孩子和右孩子(如果存在的话)压入队列,然后依据先进先出顺序遍历下一层。代码如下:
class Solution: def levelOrder(self,root): """ :param root: TreeNode :return: list[list[int]] """ if not root: return res = [] queue = [root] while queue: tmp = queue.pop(0) res += [tmp.val] if tmp.left: queue.append(tmp.left) if tmp.right: queue.append(tmp.right) return res
-
这道题解法是在普通层次遍历基础上,用栈替换队列,还要考虑左右结点压入栈的顺序。代码如下:
class Solution: def zigzagLevelOrder(self, root): """ :param root: TreeNode :return: list[list[int]] """ stack = [] res = [] if not root: return stack.append(root) flag = False values = [] stack1 = [] while stack: tmp = stack.pop() values += [tmp.val] if not flag: if tmp.left: stack1.append(tmp.left) if tmp.right: stack1.append(tmp.right) if flag: if tmp.right: stack1.append(tmp.right) if tmp.left: stack1.append(tmp.left) if len(stack) == 0: stack = stack1[:] res += [values] flag = not flag values = [] stack1 = [] return res