1. 程式人生 > >lintcode.245 子樹

lintcode.245 子樹

tco lint note return brush eno str run 存在

子樹

有兩個不同大小的二進制樹: T1 有上百萬的節點; T2 有好幾百的節點。請設計一種算法,判定 T2 是否為 T1的子樹。

註意事項

若 T1 中存在從節點 n 開始的子樹與 T2 相同,我們稱 T2 是 T1 的子樹。也就是說,如果在 T1 節點 n 處將樹砍斷,砍斷的部分將與 T2 完全相同。

您在真實的面試中是否遇到過這個題? Yes 哪家公司問你的這個題? Airbnb Amazon LinkedIn Cryptic Studios Dropbox Apple Epic Systems TinyCo Yelp Hedvig Zenefits Uber Snapchat Yahoo Microsoft Bloomberg Google Twitter Facebook
感謝您的反饋 樣例

下面的例子中 T2 是 T1 的子樹:

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

下面的例子中 T2 不是 T1 的子樹:

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





很神奇的一道題,有個樣例是{9,9,9,9,9,9,9.......},會卡住。
就是說開始判斷時,子樹為空有的節點,樹上也不能有,否則就不是子樹了。一開始一直沒想明白。


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) { 
bool result = false; 
if (T2 == NULL) 
{ 
    return true; 
} 
if (T1 == NULL) 
{ 
    return false; 
} 

if (T1->val == T2->val) { 
    result = hasSubtree(T1,T2); 
} 
if (!result) { 
    result = isSubtree(T1->left,T2); 
} 
if (!result) { 
    result = isSubtree(T1->right,T2); 
} 
    return result; 
} 


bool hasSubtree(TreeNode *T1, TreeNode *T2)
{
    if(T2==NULL && T1==NULL)
    return true;

    if (T1 != NULL && T2!=NULL && T1->val == T2->val)
    {
            return hasSubtree(T1->left,T2->left) && hasSubtree(T1->right,T2->right);
    }
    return false;
}
};

  很尷尬的是,同樣的代碼,會runtime error。

代碼如下:

/**
 * 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, T2: The roots of binary tree.
     * @return: True if T2 is a subtree of T1, or false.
     */
    bool isSubtree(TreeNode *T1, TreeNode *T2) {
        // write your code here
        bool res= false;
        if(T2 == NULL)
            return true;
        if(T1 == NULL)
            return false;
        if(T1 -> val == T2 -> val)
            res = cmp(T1,T2);
        if(!res)
            res=isSubtree(T1->left,T2);
        if(!res)
            res=isSubtree(T1->right,T2);
        return res;
    }
    bool cmp(TreeNode *T1,TreeNode *T2){
        if(T2 == NULL && T1 == NULL)
            return true;
        if(T1 -> val == T2 -> val && T1 != NULL && T2 != NULL)
            return cmp(T1->left,T2->left) && cmp(T1->right,T2->right);
        return false;
    }
};

  

這就很尷尬了,我也不知道咋回事。。。求大佬指點

lintcode.245 子樹