劍指offer 樹相關

2022-02-09 21:52:51 字數 2253 閱讀 7563

樹相關

1.重建二叉樹

1

class

solution

89 treenode* constructcore(vector pre,vector vin, int sp, int ep, int si, int

ei)10

20//

中序找到根,分為左右子樹

21int index =si;

22while(index <= ei && vin[index] !=rootvalue)

23 ++index;

24int leftlen = index-si;//

左子樹長度

25if(leftlen > 0)26

29if(leftlen < ep-sp)

3033

return

root;34}

35 };

2.樹的子結構

1

class

solution

18return

res;19}

20//

判斷是否是子樹

21bool issubtree(treenode* proot1, treenode*proot2)

2237 };

3.二叉樹映象

1

class

solution

23 };

4.對稱二叉樹

1

class

solution 78

bool issymmetrical(treenode* proot1, treenode*proot2)

920 };

5.二叉樹前中後續遍歷,遞迴和迴圈版

遞迴就是遞迴,迴圈實現用棧(前序中序比較簡單,後續的話需要簡單修改一下前序遍歷,反轉即可)

前序遍歷非遞迴版

1

class

solution ;

7 stacks;

8s.push(root);

9while(!s.empty())

1019

return

res;20}

21 };

6.後序遍歷非遞迴版

1

class

solution ;

8 stacks;

9s.push(root);

10while(!s.empty())

1120

reverse(res.begin(), res.end());

21return

res;22}

23 };

7.二叉樹中和為某值的路徑

1

class

solution

1213

void find(treenode* root, int target, vectorcur)

1427

}28 };

8.二叉樹的深度

(遞迴)

1

class

solution

1011

//遞迴函式,每遇到null節點說明到底了,更新res

12void getdepth(treenode* root, int

depth)

1319

else

2024

}25 };

非遞迴(使用佇列bfs層序遍歷 數層數)

class

solution

if (p->right)}}

return

depth;

}};

9.二叉樹的最小深度(使用佇列來實現,將上面乙個演算法簡單改改即可:在第一次左右子節點都不存在時,跳出即可)

1

class

solution 26}

27return

depth;28}

29//

從上述方法我們可以想到,求算二叉樹深度,也可以採用此法,跟我們原來的做法略有不同

3031

//神奇的遞迴做法

32int run(treenode *root)

42 };

序列化和反序列化二叉樹

劍指offer 4 13 樹相關

輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 public class treenode public class solution public boolean fs treenode root1,treenode root2 return fs root...

劍指offer 棧相關

回歸一下基本概念 python 實現棧 例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。注意 這兩個序列的長度是相等的 思路 借用乙個輔助的棧,遍歷壓棧順序,先將第乙個放入棧中,這裡是1,然後判斷棧...

劍指offer 樹 遞迴

輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 回溯 coding utf 8 class treenode def init self,x self.val x self.left none self.right none class solution de...