1. 程式人生 > >求一棵樹是否是另一棵樹的子樹

求一棵樹是否是另一棵樹的子樹

由於結點資料可能重複  ,如下圖   

    樹s                          樹t                     
  
     3                           4
    / \                         / \                              
   4   5                       1  2
  / \
 1   2


或樹s                            樹t

   1                              1
  / \                             
 1   1

        先判斷兩棵樹的根結點是否為空,如果均為空,則為真;如果t為空,s不為空,則t所在樹是s所在樹的子樹;如果t不為空,s為空,則為假。                                                                                                                                                                                                             在兩棵樹的根結點都不為空的情況下,先判斷兩棵樹的根結點資料是否相同,如果相同,則判斷是否是相同的樹,如果是,則為真;否則,去s的左子樹重複上述過程,如果結果仍為假,去s的右子樹重複上述過程。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool isSameTree(struct TreeNode* p ,struct TreeNode* q)
{
    if(p == NULL && q == NULL)
    {
        return true;
    }
    if(p == NULL || q == NULL)
    {
        return false;
    }
    if(p->val != q->val)
    {
        return false;
    }
    return (isSameTree(p->left,q->left) && isSameTree(p->right,q->right));
}


bool isSubtree(struct TreeNode* s, struct TreeNode* t) {
    if(s == NULL && t == NULL)     //如果兩棵樹均為空,結果為真
    {
        return true;
    }
    if(s == NULL && t != NULL)     
    {
        return false;
    }
    if(s != NULL && t == NULL)
    {
        return true;
    }
    bool result = false;
    if(s->val == t->val)
    {
        result = isSameTree(s,t);
    }  
    if(result == false)
    {
        result =  isSubtree(s->left,t);
    }
    if(result == false)
    {
        result = isSubtree(s->right,t);
    }
    return result;
}