日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【整理自用】二叉树的子树、子结构

發(fā)布時間:2024/5/14 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【整理自用】二叉树的子树、子结构 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

二叉樹的子樹和子結(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。