樹相關
1.重建二叉樹
1class
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.樹的子結構
1class
solution
18return
res;19}
20//
判斷是否是子樹
21bool issubtree(treenode* proot1, treenode*proot2)
2237 };
3.二叉樹映象
1class
solution
23 };
4.對稱二叉樹
1class
solution 78
bool issymmetrical(treenode* proot1, treenode*proot2)
920 };
5.二叉樹前中後續遍歷,遞迴和迴圈版
遞迴就是遞迴,迴圈實現用棧(前序中序比較簡單,後續的話需要簡單修改一下前序遍歷,反轉即可)
前序遍歷非遞迴版
1class
solution ;
7 stacks;
8s.push(root);
9while(!s.empty())
1019
return
res;20}
21 };
6.後序遍歷非遞迴版
1class
solution ;
8 stacks;
9s.push(root);
10while(!s.empty())
1120
reverse(res.begin(), res.end());
21return
res;22}
23 };
7.二叉樹中和為某值的路徑
1class
solution
1213
void find(treenode* root, int target, vectorcur)
1427
}28 };
8.二叉樹的深度
(遞迴)
1class
solution
1011
//遞迴函式,每遇到null節點說明到底了,更新res
12void getdepth(treenode* root, int
depth)
1319
else
2024
}25 };
非遞迴(使用佇列bfs層序遍歷 數層數)
classsolution
if (p->right)}}
return
depth;
}};
9.二叉樹的最小深度(使用佇列來實現,將上面乙個演算法簡單改改即可:在第一次左右子節點都不存在時,跳出即可)
1class
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...