迭代:广度优先遍历,递归:深度优先遍历

题目

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

例如:

给定二叉树 [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
# Definition for a binary tree node.
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):
# 假设res是[ [1],[2,3] ], index是3,就再插入一个空list放到res中
if len(res)<index:
res.append([])
# 将当前节点的值加入到res中,index代表当前层,假设index是3,节点值是99
# res是[ [1],[2,3] [4] ],加入后res就变为 [ [1],[2,3] [4,99] ]
res[index-1].append(r.val)
# 递归的处理左子树,右子树,同时将层数index+1
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]]