###### tags: `Leetcode` `medium` `tree` `bfs` `python` # 103. Binary Tree Zigzag Level Order Traversal ## [題目連結:] https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/ ## 題目: Given the root of a binary tree, return the zigzag level order traversal of its nodes' values. (i.e., from left to right, then right to left for the next level and alternate between). ![](https://i.imgur.com/n6RxZNu.png) ![](https://i.imgur.com/IDUjM96.png) #### [圖片來源:] https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/ ## 解題想法: 兄弟題目: [102. Binary Tree Level Order Traversal](/uzzm6rKYT0iLgackHNRl5A) * 此題為求level-order,但是每一層的值要交替呈現 * 即第一行左到右、第二行右到左、第三行左到右.... * 設字典 * dic * key: level * val: list() for append node * 判斷當前level為奇數or偶數 * root第一層:level=0 * 每次從que中pop最早進入的 * 判斷level: * 若偶數: 新加入的node.val一律加到list**最右邊** * 可以正常append * 若奇數: 新加入的node.val一律加到list**最左邊** * 用insert(0,node.val) ## Python: ``` python= from collections import defaultdict class TreeNode(): def __init__(self,val=0,left=None,right=None): self.val=val self.left=left self.right=right def insertLeft(self,node): if not self.left: self.left=TreeNode(node) else: self.left.insertLeft(node) def insertRight(self,node): if not self.right: self.right=TreeNode(node) else: self.right.insertRight(node) def printTree(self): root=self stack=[root] res=[] while stack: root=stack.pop(0) res.append(root.val) if root.left: stack.append(root.left) if root.right: stack.append(root.right) print(res) class Solution(object): def zigzagLevelOrder(self, root): """ :type root: TreeNode :rtype: List[List[int]] """ if not root: return [] dic=defaultdict(list) que=[{'level':0,'node':root}] while que: #每次pop最左邊的: 3->9->20->15->7 cur=que.pop(0) curLevel=cur['level'] curRoot=cur['node'] #若偶數: 新加入的node.val一律加到list**最右邊** if curLevel%2==0: dic[curLevel].append(curRoot.val) #若奇數: 新加入的node.val一律加到list**最左邊** else: dic[curLevel].insert(0,curRoot.val) if curRoot.left: que.append({'level':curLevel+1, 'node':curRoot.left}) if curRoot.right: que.append({'level':curLevel+1, 'node':curRoot.right}) return [ dic[key] for key in dic] root=TreeNode(1) root.insertLeft(2) root.insertRight(3) root.left.insertLeft(4) root.left.insertRight(5) root.right.insertLeft(6) root.right.insertRight(7) print('orignal tree:',end=' ') root.printTree() result = Solution() ans = result.zigzagLevelOrder(root) print(ans) ```