1. 程式人生 > >245 子樹

245 子樹

中繼 box sdn tar node In AC ssa spa

原題網址: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 的子樹:

       1               3
      / \               T1 = 2   3       T2 =    4
        /
       4

標簽 二叉樹 遞歸 思路:又是讓人頭疼的二叉樹,一般可通過遞歸解決。這道題骨骼清奇的地方在於,他需要兩個遞歸。 isSame的目的是定根對比子樹,isSubtree是定子樹對比根。 轉自此文 也就是說如果根節點的val相等時,跳入到isSame中進行計算,順著根同時遍歷兩棵樹,看是兩棵樹否相同; 若isSame返回false,就回到isSubtree中,對左右子樹繼續計算,尋找到一致的根節點再跳到isSame中判斷,若左右子樹都找不到,返回false。
簡單說來就是先在T1中定位與T2的根相同的節點,找到根節點後順藤摸瓜挨個對比結點,若不相同返回,在T1左右子樹中繼續定位與T2的根相同的節點,重復以上過程。 AC代碼
/**
 * 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 子樹