【整理自用】二叉树的子树、子结构
二叉樹的子樹和子結(jié)構(gòu)
子樹的意思是只要包含了一個結(jié)點,就得包含這個結(jié)點下的所有節(jié)點.
子結(jié)構(gòu)的意思是包含了一個結(jié)點,可以只取左子樹或者右子樹,或者都不取。
簡單而言,與子樹不同的是,子結(jié)構(gòu)可以是A樹的任意一部分。
這里以一顆7節(jié)點,高度為3的滿二叉樹為例,說明子樹和子結(jié)構(gòu)的差別:
圖1
1.圖1的子樹示意圖
對于圖1而言,子樹意味著圖2,圖3等情況。根據(jù)定義非常好理解。
圖2 圖1子樹的某一種情況
圖3 圖1子樹的某一種情況
2.圖1的子結(jié)構(gòu)示意圖
由于子結(jié)構(gòu)可以是原樹的任意一個部分,因此圖3就是一個子結(jié)構(gòu)。
、
圖4 圖1的子結(jié)構(gòu)示意圖
3.求二叉樹A子樹的代碼
//函數(shù)聲明,這里是為了先看首先要調(diào)用的函數(shù),才放到后面去的。bool isSubtree(TreeNode* pRoot1, TreeNode* pRoot2);//正式開始第一個函數(shù)bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){//因為定義空樹不是任何一個樹的子樹,因此如果有個根節(jié)點是空樹,那么直接返回falseif(pRoot1 == NULL || pRoot2 == NULL) return false;bool result = false;//如果當前兩個樹節(jié)點值相同,就調(diào)用其他函數(shù)判斷能否以當前節(jié)點為根節(jié)點下找到相同的子樹。if(pRoot1->val == pRoot2->val){result = isSubtree(pRoot1, pRoot2);}//如果不同或者是以當前節(jié)點為根節(jié)點下找不到相同的子樹,那么就看看A樹的左節(jié)點或者右節(jié)點中有沒有。if(!result)result = HasSubtree(pRoot1->left, pRoot2);if(!result)result = HasSubtree(pRoot1->right, pRoot2);return result;}bool isSubtree(TreeNode* pRoot1, TreeNode* pRoot2){//因為是子樹:只要包含了一個結(jié)點,就得包含這個結(jié)點下的所有節(jié)點。//因此,A樹與其子樹一定最后同時訪問到空指針。if(pRoot2 == NULL && pRoot1 == NULL)return true;else if(pRoot2 != NULL && pRoot1 != NULL){if(pRoot1->val != pRoot2->val){return false;}return isSubtree(pRoot1->left, pRoot2->left) && isSubtree(pRoot1->right, pRoot2->right);}elsereturn false;}4. 求二叉樹A子結(jié)構(gòu)的代碼
根據(jù)定義,可以知道子樹是子結(jié)構(gòu)中的一種特殊情況,因此兩段代碼之間有很大的相似之處。
不同之處在于:
1. 子樹只要包含了一個結(jié)點,就得包含這個結(jié)點下的所有節(jié)點。因此,A樹與其子樹一定最后同時訪問到空指針。
2. 子結(jié)構(gòu)只要包含任意相連的任意數(shù)量的結(jié)點即可。
因此,對于子結(jié)構(gòu)而言,只要在子結(jié)構(gòu)訪問到空指針之前,所有的節(jié)點均和A樹的某部分相同就可以了。
//函數(shù)聲明,這里是為了先看首先要調(diào)用的函數(shù),才放到后面去的。bool isSubtree(TreeNode* pRoot1, TreeNode* pRoot2);//正式開始第一個函數(shù)bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){//因為定義空樹不是任何一個樹的子樹,因此如果有個根節(jié)點是空樹,那么直接返回falseif(pRoot1 == NULL || pRoot2 == NULL) return false;bool result = false;//如果當前兩個樹節(jié)點值相同,就調(diào)用其他函數(shù)判斷能否以當前節(jié)點為根節(jié)點下找到相同的子樹。if(pRoot1->val == pRoot2->val){result = isSubtree(pRoot1, pRoot2);}//如果不同或者是以當前節(jié)點為根節(jié)點下找不到相同的子樹,那么就看看A樹的左節(jié)點或者右節(jié)點中有沒有。if(!result)result = HasSubtree(pRoot1->left, pRoot2);if(!result)result = HasSubtree(pRoot1->right, pRoot2);return result;}bool isSubtree(TreeNode* pRoot1, TreeNode* pRoot2){//這里不一樣!!!!//這里不一樣!!!!//這里不一樣!!!!//子結(jié)構(gòu)訪問到空指針時,和A樹的比較都一直是true就是true.//而這個函數(shù)能一直循環(huán)下去,就意味著之前的比較都是true,因此,這里程序改為if(pRoot2 == NULL)return true;else if(pRoot1 == NULL) return false; else if(pRoot2 != NULL && pRoot1 != NULL){if(pRoot1->val != pRoot2->val){return false;}return isSubtree(pRoot1->left, pRoot2->left) && isSubtree(pRoot1->right, pRoot2->right);}elsereturn false;}總結(jié)
以上是生活随笔為你收集整理的【整理自用】二叉树的子树、子结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 担心二建考不过的同学看过来
- 下一篇: 出太阳了