演算法學習記錄十三(C++)--->10年微軟面試題樹的子結構
描述
輸入兩棵二叉樹A和B,判斷樹B是不是A的子結構。
分析
例如,下圖中的兩棵樹A和B,由於A中有一部分子樹的結構和B是一樣的,因此B就是A的子結構。
第一步:找到相同根節點
第二步:找到相同根節點後匹配左右子樹是否值都匹配
程式碼 (複雜flag版本但是思路很清晰)
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
/*
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
bool flag = false;
// 當兩棵樹都不為空的時候進行匹配
if(!pRoot1 == NULL && !pRoot2 == NULL){
if(pRoot1->val == pRoot2->val){
// 當根節點相同的時候進行判斷是否包含
flag = tree2ContainerTree1(pRoot1,pRoot2);
}
// 如果上面根節點不同,那麼flag是no 或者根節點相同而且對應的flag匹配失敗,還是no
if(!flag){
flag = HasSubtree(pRoot1->left,pRoot2);
}
// 如果左子樹未匹配到,那麼進行右子樹匹配
if(!flag){
flag = HasSubtree(pRoot1->right,pRoot2);
}
}
return flag;
}
// 判斷是否被包含
bool tree2ContainerTree1(TreeNode *node1, TreeNode *node2){
// 當node2的樹遍歷完的時候就是被包含的
if(node2 == NULL){
return true;
}
// 當node1的樹提前結束,node2沒結束,肯定不包含
if(node1 == NULL){
return false;
}
// 當某個節點不同的時候 不包含
if(node1->val != node2->val){
return false;
}
// 如果根節點都對的上,那麼繼續用子節點進行匹配,左右都匹配到的時候才算被包含
return tree2ContainerTree1(node1->left,node2->left) && tree2ContainerTree1(node1->right,node2->right);
}
};
*/
程式碼(精簡版本)
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1 == NULL || pRoot2 == NULL)return false;
return tree2ContainerTree1(pRoot1,pRoot2) ||
HasSubtree(pRoot1->left,pRoot2) ||
HasSubtree(pRoot1->right,pRoot2);
}
// 判斷是否被包含
bool tree2ContainerTree1(TreeNode *node1, TreeNode *node2){
if(node2 == NULL) return true;
if(node1 == NULL) return false;
if(node1->val == node2->val){
return tree2ContainerTree1(node1->left,node2->left) && tree2ContainerTree1(node1->right,node2->right);
}else{
return false;
}
}
};
1.真的||
運算子,C的特性就是當某一個為真的時候就不會繼續向下執行,因此不會有過多的運算
2.tree2ContainerTree1
該方法是當根節點一致的時候,左右子樹是否一致,當node2為空的時候 就是被包含了,如果node1提前為空,而node2還不為空,肯定不包含了,遞迴向左右進行節點判斷
3.HasSubtree
當根節點一致的時候,就去呼叫tree2ContainerTree1
進行包含判斷,但是如果不等,遞迴HasSubtree
進行匹配,直到節點相同進行包含判斷,否則的話就是不包含
相關文章
- 微軟的100道演算法面試題(終結版)微軟演算法面試題
- 面試演算法題記錄面試演算法
- 記錄近期面試題,面試總結面試題
- 微軟演算法面試題:如何找最長的增長子序列微軟演算法面試題
- 資料結構和演算法面試題系列—二叉樹面試題彙總資料結構演算法面試題二叉樹
- [leetcode/lintcode 題解] 微軟 面試題:實現 Trie(字首樹)LeetCode微軟面試題
- 面試題記錄面試題
- c++學習記錄C++
- 設計模式學習筆記(十三)組合模式及其在樹形結構中的應用設計模式筆記
- 樹的學習——樹的儲存結構
- 資料結構和演算法學習筆記十六:紅黑樹資料結構演算法筆記
- struct 結構體 -Go 學習記錄Struct結構體Go
- 資料結構和演算法面試題系列—二叉樹基礎資料結構演算法面試題二叉樹
- 資料結構與演算法(十三)——紅黑樹2資料結構演算法
- 資料結構與演算法(十三)——紅黑樹1資料結構演算法
- 【演算法工程師】機器學習面試問題總結演算法工程師機器學習面試
- 前端筆試題面試題記錄前端筆試面試題
- C++學習記錄1C++
- 演算法、資料結構 常見面試題演算法資料結構面試題
- 微軟最新面試題10.30微軟面試題
- 【演算法學習筆記】生成樹問題探究演算法筆記
- 資料結構學習之樹結構資料結構
- 蘋果、微軟等巨頭107道機器學習面試題蘋果微軟機器學習面試題
- 前端筆試題面試題記錄(下)前端筆試面試題
- JS面試考題記錄JS面試
- 面試刷題偶有記錄面試
- [學習筆記] Splay & Treap 平衡樹 - 資料結構筆記資料結構
- 記錄:演算法題數學知識總結演算法
- 資料結構和演算法面試題系列—數字題總結資料結構演算法面試題
- 資料結構和演算法面試題系列—連結串列資料結構演算法面試題
- 基礎面試題 — 資料結構與演算法面試題資料結構演算法
- 資料結構和演算法面試題系列—字串資料結構演算法面試題字串
- 資料結構和演算法面試題系列—棧資料結構演算法面試題
- PHP 第十三週函式學習記錄PHP函式
- 《資料結構與演算法分析》學習筆記-第四章-樹資料結構演算法筆記
- 【演算法學習筆記】動態規劃與資料結構的結合,在樹上做DP演算法筆記動態規劃資料結構
- [演算法總結] 20 道題搞定 BAT 面試——二叉樹演算法BAT面試二叉樹
- 資料結構和演算法面試題系列—揹包問題總結資料結構演算法面試題
- 記錄一次測開面試題記錄面試題