迭代:广度优先遍历,递归:深度优先遍历
题目
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
题解
方法一:迭代
采用队列(FIFO),每层入队,统计该层结点数,每层出队完时,下一层入队。最后进行列表翻转即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| from queue import Queue
class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None def create_tree(list_tree): if not list_tree: return [] new_queue= Queue() root = TreeNode(list_tree[0]) new_queue.put(root) count = 1 while not new_queue.empty() and count<len(list_tree): dequeue = new_queue.get() if not dequeue.left and not dequeue.right: if count<len(list_tree) and list_tree[count]: dequeue.left=TreeNode(list_tree[count]) count= count+1 if count<len(list_tree) and list_tree[count]: dequeue.right=TreeNode(list_tree[count]) count= count+1
if dequeue.left: new_queue.put(dequeue.left) if dequeue.right: new_queue.put(dequeue.right) return root class Solution: def levelOrder(self, root: TreeNode): if not root: return [] new_queue=Queue() list_level=[] new_queue.put(root) while not new_queue.empty(): count =new_queue.qsize() tmp=[] while count: dequeue= new_queue.get() tmp.append(dequeue.val) if dequeue.left: new_queue.put(dequeue.left) if dequeue.right: new_queue.put(dequeue.right) count= count-1 list_level.append(tmp) return list_level[::-1]
root = [3,9,20,None,None,15,7] root_tree=create_tree(root) a=Solution() result =a.levelOrder(root_tree) result
|
[[15, 7], [9, 20], [3]]
方法二:递归
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution(object): def levelOrder(self, root): """ :type root: TreeNode :rtype: List[List[int]] """ if not root: return [] res = [] def dfs(index,r): if len(res)<index: res.append([]) res[index-1].append(r.val) if r.left: dfs(index+1,r.left) if r.right: dfs(index+1,r.right) dfs(1,root) return res[::-1] root = [3,9,20,None,None,15,7] root_tree=create_tree(root) a=Solution() result =a.levelOrder(root_tree) result
|
[[15, 7], [9, 20], [3]]