給定乙個二叉樹,返回其節點值的鋸齒形層次遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。
例如:給定二叉樹[3,9,20,null,null,15,7]
,
3返回鋸齒形層次遍歷如下:/ \9 20
/ \
15 7
[[3],
[20,9],
[15,7]
]
每層的佇列正常處理,隔一行計算結果時反轉加入結果陣列
1 classsolution:2 def zigzaglevelorder(self, root: treenode) -> list[list[int]]:
3 res=
4 ifnot root:
5 returnres
6 stack=[root]
7 count=0
8 whilestack:
10 l=len(stack)
11 for i inrange(l):
13 ifstack[i].left:
15 ifstack[i].right:
17 if count==1:
18 res[-1].reverse()
19 count=0
20 else:
21 count=1
22 stack=stack[l:]
23 return res
但這樣的時間複雜度比較大,因為reverse操作比較費時。
利用雙端佇列,佇列中順序始終是正常的,但奇數行從右向左遍歷,pop右邊的,孩子push進左邊。偶數行從左向右遍歷,pop左邊的,孩子push進右邊。
1 classsolution ;}5 dequemy_queue;
6 my_queue.push_back(proot);
7 vector>res;
8 int cnt=0;
9 while(not my_queue.empty()));
11 int cur_siz=my_queue.size();
12 decltype(proot) cur;
13 for(int i=0;ii)
20 if(cur->left)
23 }
24 else
30 if(cur->right)
33 }
34 res.back().push_back(cur->val);
35 }
36 ++cnt;
37 }
38 returnres;
39 }
40 };
用兩個棧模擬佇列(普通佇列)。題解看見的思路,很有意思:兩個棧,比如1、3、5行存棧1裡,2、4、6存棧2裡,棧1每次pop時,左右孩子分別push進棧2,這樣棧1中的棧頂元素的左右孩子在棧2的棧底,棧1中的棧底元素的左右孩子在棧2的棧頂,再對棧2pop,pop的左右孩子再push進棧1,就這樣交錯push/pop。其實就是用兩個棧模擬佇列,演算法導論上看過,不過這裡能活學活用還是挺有意思的。
1 vectorint>> zigzaglevelorder(treenode *root)18if (!tmp.empty()) else
break;22
23while (!d2.empty())
30if (!tmp.empty()) else
break;34
}35return
r;36 };
103 二叉樹的鋸齒形層次遍歷
本題跟102很像,就是將二叉樹的偶數層逆序輸出 我是直接將上一題的結果的偶數層reverse一下 definition for a binary tree node.class treenode def init self,x self.val x self.left none self.right...
103 二叉樹的鋸齒形層次遍歷
給定乙個二叉樹,返回其節點值的鋸齒形層次遍歷。即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行 例如 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7返回鋸齒形層次遍歷如下 3 20,9 15,7 看到本題目,首先想到的是使用佇列或棧,然而簡單使用這...
103 二叉樹的鋸齒形層次遍歷
難度 中等 題目描述 思路總結 層次遍歷 insert頭 題解一 definition for a binary tree node.class treenode def init self,x self.val x self.left none self.right none from colle...