103 二叉樹的鋸齒形層次遍歷

2022-05-08 22:09:11 字數 2187 閱讀 5377

給定乙個二叉樹,返回其節點值的鋸齒形層次遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。

例如:給定二叉樹[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...