二叉樹的子樹和子結構 c++
鑑於二叉樹的子樹及二叉樹的子結構問題,現總結如下:
什麼是二叉樹的子結構及子樹?
子樹的意思是包含了一個結點,就得包含這個結點下的所有節點,一棵大小為n的二叉樹有n個子樹,就是分別以每個結點為根的子樹。子結構的意思是包含了一個結點,可以只取左子樹或者右子樹,或者都不取。
1、輸入兩棵二叉排序樹A,B,判斷B是不是A的子樹。(ps:我們約定空樹不是任意一個樹的子樹)
二叉排序樹,又稱為二叉查詢樹,它或是一棵空樹,或是一棵具有以下性質的樹:
1)若它的左子樹不空,則左子樹上所有結點的值都小於它的根結點的值;
2)若它的右子樹不空,則右子樹上所有結點的值都小於它的根結點的值;
3)它的左右子樹也分別為二叉排序樹。
分析:其一、A、B是二叉搜尋樹,說明樹中每個結點的值都大於左孩子結點的值,並且小於右孩子結點的值。
其二、判斷是不是子樹,說明在樹A中找到和樹B的根結點對應的結點後,該結點下面所有的結點都應該是一致的。
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
bool IsSametree(TreeNode* pRoot1,TreeNode* pRoot2)
{
if(pRoot1==NULL&&pRoot2 == NULL)//同時達到葉子結點
return true;
else
return false;
if(pRoot1->val == pRoot2->val)
return IsSametree(pRoot1->left,pRoot2->left)&&IsSametree(pRoot1->right,pRoot2->right);
else
return false;
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot2 == NULL)
return false;
else if(pRoot1 == NULL)
return false;
if(pRoot1->val == pRoot2->val)
return IsSametree(pRoot1,pRoot2);
if(pRoot1->val > pRoot2->val)
return HasSubtree(pRoot1->left,pRoot2);
if(pRoot1->val < pRoot2->val)
return HasSubtree(pRoot1->right,pRoot2);
}
呼叫的函式為HasSubtree,由於A、B為二叉排序樹,所以可以根據值來判斷下一步是從A的左子樹還是右子樹來尋找,如果沒有知識單純的二叉樹,可以將值判斷的兩行程式碼用或的關係語句代替,詳見下面程式碼。
2、劍指offer中的題目描述:輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
首先仔細看題目,其一、普通的二叉樹,沒有別的功能;其二、子結構,可以是A樹的任意一部分。
分析可能性,還是依照上面的思路來寫程式碼,但是要有一些改變。首先,遞迴返回的條件不一樣,當B到達了葉子結點,但是A沒有到葉子結點,也是正確的,這是和上題不一樣的地方。但是如果A先到葉子結點,就肯定不對,返回false。再者,因為不是二叉排序樹,所以結點的值沒有限制,如果不同的結點有相同的值,這就要注意了!可能找到和B根結點一樣的值,但是從該結點往下檢視,發現結點沒有對應,不要直接返回false!因為可能有別的結點有相同的值,從該結點往下和B一樣!此時要設定一個標誌位,當是子結構是返回true,當不是子結構時返回false,此時再去搜尋A的下一個結點,繼續判斷。
class Solution {
public:
bool IsSubtree(TreeNode* pRoot1,TreeNode* pRoot2)
{
if(pRoot2==NULL) //B同時或先到達葉子結點
return true;
else if(pRoot1 == NULL)
return false; //B不是空,但A是空,說明A先到達葉子結點
if(pRoot1->val == pRoot2->val)
return IsSubtree(pRoot1->left,pRoot2->left)&&IsSubtree(pRoot1->right,pRoot2->right);
else
return false;
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot2 == NULL)
return false;
else if(pRoot1 == NULL)
return false; // A先到達葉子結點
bool flag = false;
if(pRoot1->val == pRoot2->val)
flag = IsSubtree(pRoot1,pRoot2);
if(!flag)
flag = HasSubtree(pRoot1->left,pRoot2)||HasSubtree(pRoot1->right,pRoot2);
return flag;
}
};
相關文章
- 二叉樹的子結構二叉樹
- 二叉樹的子結構、深度以及重建二叉樹二叉樹
- 【劍指offer】樹的子結構
- JZ-017-樹的子結構
- 【資料結構】二叉樹(c++)資料結構二叉樹C++
- 二叉樹葉子個數二叉樹
- 樹2-二叉樹複製, 遍歷, 計算葉子結點和高度二叉樹
- 劍指offer-17:樹的子結構
- 劍指offer面試18 樹的子結構面試
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 資料結構(樹):二叉樹資料結構二叉樹
- 資料結構之樹結構概述(含滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹、紅黑樹、B-樹、B+樹、B*樹)資料結構二叉樹
- 檢驗一顆樹是不是另一顆樹的子結構
- 重學資料結構之樹和二叉樹資料結構二叉樹
- 重學資料結構(六、樹和二叉樹)資料結構二叉樹
- 資料結構:樹和二叉樹定義和術語資料結構二叉樹
- 【資料結構導論之樹和二叉樹總結篇】資料結構二叉樹
- 資料結構的故事之二叉樹, 字首樹, N叉樹資料結構二叉樹
- 資料結構——樹與二叉樹的遍歷資料結構二叉樹
- [資料結構] 樹、二叉樹、森林的轉換資料結構二叉樹
- 資料結構學習(c++)——二叉樹 (轉)資料結構C++二叉樹
- 反轉連結串列、合併連結串列、樹的子結構
- C++樹——遍歷二叉樹C++二叉樹
- 二叉樹的儲存結構二叉樹
- 二叉搜尋樹的結構
- 一類子樹問題的總結
- LeetCode題解(Offer26):判斷二叉樹A是否為二叉樹B的子樹(Python)LeetCode二叉樹Python
- 資料結構和演算法-二叉樹,AVL,紅黑樹資料結構演算法二叉樹
- 資料結構-二叉樹資料結構二叉樹
- 資料結構 - 二叉樹資料結構二叉樹
- 【資料結構】二叉樹!!!資料結構二叉樹
- 資料結構學習(C++)——二叉樹【2】 (轉)資料結構C++二叉樹
- 資料結構學習(C++)——二叉樹【3】 (轉)資料結構C++二叉樹
- 資料結構學習(C++)——二叉樹【1】 (轉)資料結構C++二叉樹
- 資料結構與演算法——表示式樹類的C++實現(二叉樹)資料結構演算法C++二叉樹
- Java 樹結構實際應用 四(平衡二叉樹/AVL樹)Java二叉樹
- 資料結構和演算法:二叉樹資料結構演算法二叉樹
- 演算法學習記錄十三(C++)--->10年微軟面試題樹的子結構演算法C++微軟面試題