給定一個二叉樹,返回其節點值的鋸齒形層次遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。
思路:逐層遍歷,所以優先選擇BFS(寬度優先)
如果正常順序(統一從左到右)的話,可以先看這個二叉樹的層序遍歷
鋸齒遍歷的話,解題思路如下:
1.我們不改變進隊列的順序,下層一直按從左到右進隊。
2.但我們會將 隊列值的訪問,進隊出隊 這兩步分開操作。
3.即先將本層根據層數從左到右或從右到左訪問。之後將本層節點出隊,下層依然按照固定順序
入隊
數據分析:
queue:它裏面永遠存且僅存 一層節點
class Solution:
def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
queue=collections.deque()
queue.append(root)
if not root:
return []
n=0
lt=[]
while queue:
size=len(queue)
n=(n+1)%2
l=[]
#根據n值,改變訪問方向
if n:
for i in range(size):
l.append(queue[i].val)
else:
for i in range(-1,-size-1,-1):
l.append(queue[i].val)
#存入總列表
if l:
lt.append(l)
#本層出隊,下層按統一方向(從左到右)進隊
for i in range(size):
cur=queue.popleft()
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
return lt