245 子樹
阿新 • • 發佈:2018-06-18
中繼 box sdn tar node In AC ssa spa
簡單說來就是先在T1中定位與T2的根相同的節點,找到根節點後順藤摸瓜挨個對比結點,若不相同返回,在T1左右子樹中繼續定位與T2的根相同的節點,重復以上過程。
AC代碼
原題網址:https://www.lintcode.com/problem/subtree/description
描述
有兩個不同大小的二叉樹: T1
有上百萬的節點; T2
有好幾百的節點。請設計一種算法,判定 T2
是否為 T1
的子樹。
若 T1 中存在從節點 n 開始的子樹與 T2 相同,我們稱 T2 是 T1 的子樹。也就是說,如果在 T1 節點 n 處將樹砍斷,砍斷的部分將與 T2 完全相同。
您在真實的面試中是否遇到過這個題?樣例
下面的例子中 T2 是 T1 的子樹:
1 3
/ \ /
T1 = 2 3 T2 = 4
/
4
下面的例子中 T2 不是 T1 的子樹:
標簽 二叉樹 遞歸 思路:又是讓人頭疼的二叉樹,一般可通過遞歸解決。這道題骨骼清奇的地方在於,他需要兩個遞歸。 isSame的目的是定根對比子樹,isSubtree是定子樹對比根。 轉自此文 也就是說如果根節點的val相等時,跳入到isSame中進行計算,順著根同時遍歷兩棵樹,看是兩棵樹否相同; 若isSame返回false,就回到isSubtree中,對左右子樹繼續計算,尋找到一致的根節點再跳到isSame中判斷,若左右子樹都找不到,返回false。1 3 / \ T1 = 2 3 T2 = 4 / 4
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param T1: The roots of binary tree T1.
* @param T2: The roots of binary tree T2.
* @return: True if T2 is a subtree of T1, or false.
*/
bool isSubtree(TreeNode * T1, TreeNode * T2) {
// write your code here
if (T2==NULL)
{
return true;
}
if (T1==NULL)
{
return false;
}
if (T1->val==T2->val)
{
if (isSame(T1,T2))
{
return true;
}
}
if (isSubtree(T1->left,T2))
{
return true;
}
if (isSubtree(T1->right,T2))
{
return true;
}
return false;
}
bool isSame(TreeNode *T1,TreeNode *T2)
{
if (T1==NULL&&T2==NULL)
{
return true;
}
if (T1==NULL&&T2!=NULL||T1!=NULL&&T2==NULL)
{
return false;
}
if (T1!=NULL&&T2!=NULL&&(T1->val==T2->val))
{
return isSame(T1->left,T2->left)&&isSame(T1->right,T2->right);
}
else
{
return false;
}
}
};
參考:https://blog.csdn.net/lyy_hit/article/details/49660099
https://www.2cto.com/kf/201708/673887.html
https://www.cnblogs.com/Allen-rg/p/7068918.html
https://blog.csdn.net/ljlstart/article/details/48184271
245 子樹