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