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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

二叉樹的子樹和子結構

子樹的意思是只要包含了一個結點,就得包含這個結點下的所有節點.
子結構的意思是包含了一個結點,可以只取左子樹或者右子樹,或者都不取。

簡單而言,與子樹不同的是,子結構可以是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;}

總結

以上是生活随笔為你收集整理的【整理自用】二叉树的子树、子结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。