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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 572. 另一个树的子树 思考分析

發(fā)布時間:2023/12/1 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 572. 另一个树的子树 思考分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目

給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具有相同結(jié)構(gòu)和節(jié)點值的子樹。s 的一個子樹包括 s 的一個節(jié)點和這個節(jié)點的所有子孫。s 也可以看做它自身的一棵子樹。

示例 1:
給定的樹 s:

示例 2:
給定的樹 s:

思路

思路:首先層序遍歷s樹,如果遇到結(jié)點值和t根結(jié)點值相同的,開始比較以該結(jié)點為根結(jié)點的樹與t樹是否相同。
這里有一些點需要注意:
1、s樹中可能有許多結(jié)點的值和t根結(jié)點值相同,所以我們應(yīng)該對每次比較的結(jié)果做記錄,如果有相同則直接返回true,否則必須等所有結(jié)點都遍歷之后。
2、這一題用的比較兩棵樹是否相同的函數(shù)來源于這一題:
LeetCode 100. 相同的樹 思考分析

/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/ class Solution { public:bool isSameTree(TreeNode* p, TreeNode* q) {//如果兩個結(jié)點存在if(p && q){//如果兩個結(jié)點值相同,觀察他們的左右子樹是否同時相同if(p->val == q->val){return isSameTree(p->right,q->right) && isSameTree(p->left,q->left);}//如果兩個結(jié)點值不同,說明樹不相同else{return false;} }//如果兩個結(jié)點同時不存在那么樹相同else if(!p && !q){return true;}//如果一個樹有此結(jié)點而另外一棵樹沒有此結(jié)點,則說明結(jié)構(gòu)不同return false;}bool isSubtree(TreeNode* s, TreeNode* t) {queue<TreeNode*> que;bool result = false;int right_times=0;if(s!=NULL) que.push(s);while(!que.empty()){int size = que.size();for(int i =0;i<size;i++){TreeNode* node = que.front();que.pop();if(node->val == t->val){result = isSameTree(node,t);if(result == true) right_times++; if(right_times>0) return true;}//將左右孩子結(jié)點入隊列,作為下一層的元素if(node->left) que.push(node->left);if(node->right) que.push(node->right);}}return false;} };

看了一下官方題解,第一個思路應(yīng)該是和我差不多的(判斷子樹是否相同都用的深度,不過一開始尋找相同結(jié)點我使用的是廣度)

class Solution { public:bool check(TreeNode *o, TreeNode *t) {if (!o && !t) {return true;}if ((o && !t) || (!o && t) || (o->val != t->val)) {return false;}return check(o->left, t->left) && check(o->right, t->right);}bool dfs(TreeNode *o, TreeNode *t) {if (!o) {return false;}return check(o, t) || dfs(o->left, t) || dfs(o->right, t);}bool isSubtree(TreeNode* s, TreeNode* t) {return dfs(s,t);} };

,后面的兩個由于還沒有學(xué)到相關(guān)知識,暫時先擱置。
另一個樹的子樹

總結(jié)

以上是生活随笔為你收集整理的LeetCode 572. 另一个树的子树 思考分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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