二叉樹的鋸齒形層次遍歷
樹的層次遍歷的升級版
方法一:BFS,定義depth,按照層數奇偶反轉
時間複雜度為O(n) 空間複雜度為O(n)
class Solution:
def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
results = [] #初始化結果集合
if not root: return []
cur_level = [root] #初始化開始結點
depth = 0
while cur_level:
result =[] #儲存這一層資料,便於後續的反轉操作
next_level = [] #儲存下一層節點
for node in cur_level:
result.append(node.val)
if node.left:
next_level.append(node.left)
if node.right:
next_level.append(node.right)
if depth%2 == 1: #按照層數關係,開始反轉操作
results.append(result[::-1])
else:
results.append(result)
depth += 1 #關鍵步驟1
cur_level = next_level #迴圈關鍵步驟2
return results
方法二:DFS,遞迴呼叫
class Solution:
def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
res = []
def helper(root:TreeNode,depth):
if not root: return []
if len(res) == depth: #看res中有多少個[],站在二維陣列的角度
res.append([]) #新增[]元素
if depth%2 == 0: res[depth].append(root.val) #在當前層數維度的[]後面新增元素
else :res[depth].insert(0,root.val) #在當前層數維度的[]頭部插入元素
helper(root.left,depth+1) #遞迴呼叫
helper(root.right,depth+1) #遞迴呼叫
helper(root,0)
return res