演算法學習記錄十三(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
進行匹配,直到節點相同進行包含判斷,否則的話就是不包含
相關文章
- 演算法學習記錄十二(C++)--->連結串列題目集合演算法C++
- 演算法學習記錄十四(C++)--->二叉樹的映象演算法C++二叉樹
- 二叉樹的子樹和子結構 c++二叉樹C++
- 資料結構學習(C++)——樹(總結) (轉)資料結構C++
- 劍指offer面試18 樹的子結構面試
- 微軟的100道演算法面試題(終結版)微軟演算法面試題
- 樹的學習——樹的儲存結構
- 微軟等資料結構+演算法面試100題全部答案集錦微軟資料結構演算法面試
- c++學習記錄C++
- 設計模式學習筆記(十三)組合模式及其在樹形結構中的應用設計模式筆記
- 面試演算法題記錄面試演算法
- 資料結構和演算法學習筆記十六:紅黑樹資料結構演算法筆記
- struct 結構體 -Go 學習記錄Struct結構體Go
- 記錄近期面試題,面試總結面試題
- 資料結構與演算法(十三)——紅黑樹1資料結構演算法
- 資料結構與演算法(十三)——紅黑樹2資料結構演算法
- 資料結構學習(c++)——二叉樹 (轉)資料結構C++二叉樹
- 資料結構和演算法面試題系列—二叉樹面試題彙總資料結構演算法面試題二叉樹
- C++學習記錄1C++
- 【演算法學習筆記】生成樹問題探究演算法筆記
- 資料結構學習之樹結構資料結構
- 資料結構學習(C++)——二叉樹【2】 (轉)資料結構C++二叉樹
- 資料結構學習(C++)——二叉樹【3】 (轉)資料結構C++二叉樹
- 資料結構學習(C++)——二叉樹【1】 (轉)資料結構C++二叉樹
- 資料結構——李超線段樹 學習筆記資料結構筆記
- [學習筆記] Splay & Treap 平衡樹 - 資料結構筆記資料結構
- 演算法學習記錄二(C++)--->字串空格替換演算法C++字串
- 演算法學習記錄十(C++)--->數值的整數次方演算法C++
- 安卓學習筆記---開篇(目錄結構)安卓筆記
- PHP 第十三週函式學習記錄PHP函式
- 演算法學習記錄四(C++)--->通過前序和中序序列重建二叉樹演算法C++二叉樹
- 記錄:演算法題數學知識總結演算法
- 《資料結構與演算法分析》學習筆記-第四章-樹資料結構演算法筆記
- 微軟演算法面試題:如何找最長的增長子序列微軟演算法面試題
- 【學習筆記】Kruskal 重構樹筆記
- kruskal重構樹學習筆記筆記
- 二叉樹的子結構二叉樹
- 【劍指offer】樹的子結構