###### tags: `Leetcode` `medium` `tree` `bfs` `python` # 107. Binary Tree Level Order Traversal II ## [題目連結] https://leetcode.com/problems/binary-tree-level-order-traversal-ii/ ## 題目: Given the ```root``` of a binary tree, return the bottom-up level order traversal of its nodes' values. (i.e., from left to right, level by level from leaf to root). ![](https://i.imgur.com/n7kFLp9.png) ![](https://i.imgur.com/2UsufLo.png) #### [圖片來源:] https://leetcode.com/problems/binary-tree-level-order-traversal-ii/ ## 解題想法: 兄弟題目:[102. Binary Tree Level Order Traversal](/uzzm6rKYT0iLgackHNRl5A) * 題目為給一binary tree,求出bottom-up level order traversal * 使用bfs,每層進行遍歷 * Interactive * Recursive * Python對於反轉: * 用res.reverse(): 不會回傳值 * 需要用 res[::-1] or 創建新的list: list(reversed(res)) ## Python: Interactive * 每次紀錄當前的所有node.val與下層的node * while繼續下一層 * 結果reverse即可 ``` python= from collections import defaultdict class TreeNode(object): def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def insertLeft(self,node): if self.left==None: self.left=TreeNode(node) else: self.left.insertLeft(node) def insertRight(self,node): if self.right==None: 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 levelOrderBottom(self, root): """ :type root: TreeNode :rtype: List[List[int]] """ if not root: return [] res=[] que=[root] while que: curLevel=[] nextLevel=[] for node in que: curLevel.append(node.val) if node.left: nextLevel.append(node.left) if node.right: nextLevel.append(node.right) res.append(curLevel) que=nextLevel return res[::-1] root=TreeNode(3) root.insertLeft(9) root.insertRight(20) root.right.insertLeft(15) root.right.insertRight(7) root.printTree() result = Solution() ans = result.levelOrderBottom(root) print(ans) ''' #sol2 class Solution: def levelOrderBottom(self, root): if not root: return [] ans=defaultdict(list) map=[{'level':0, 'node':root}] while map: #要FIFO cur=map.pop(0) root = cur['node'] ans[cur['level']].append(root.val) if root.left: map.append({'level':cur['level']+1, 'node':root.left}) if root.right: map.append({'level':cur['level']+1, 'node':root.right}) return [ans[i] for i in ans][::-1] ''' ``` ## Python: Recursive * 使用字典存每層的node * key=level * val=list() * 結果reverse即可 ``` python= from collections import defaultdict class TreeNode(object): def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def insertLeft(self,node): if self.left==None: self.left=TreeNode(node) else: self.left.insertLeft(node) def insertRight(self,node): if self.right==None: 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 levelOrderBottom(self, root): """ :type root: TreeNode :rtype: List[List[int]] """ self.res=defaultdict(list) self.bfs(root,1) return [self.res[key] for key in self.res][::-1] def bfs(self,root,level): if not root: return self.res[level].append(root.val) self.bfs(root.left,level+1) self.bfs(root.right,level+1) root=TreeNode(3) root.insertLeft(9) root.insertRight(20) root.right.insertLeft(15) root.right.insertRight(7) root.printTree() result = Solution() ans = result.levelOrderBottom(root) print(ans) ```