劍指offer-樹的子結構(python和c++)

題目描述

輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)

/*思路:參考劍指offer
1、首先設置標誌位result = false,因爲一旦匹配成功result就設爲true,
剩下的代碼不會執行,如果匹配不成功,默認返回false
2、遞歸思想,如果根節點相同則遞歸調用DoesTree1HaveTree2(),
如果根節點不相同,則判斷tree1的左子樹和tree2是否相同,
再判斷右子樹和tree2是否相同
3、注意null的條件,HasSubTree中,如果兩棵樹都不爲空才進行判斷,
DoesTree1HasTree2中,如果Tree2爲空,則說明第二棵樹遍歷完了,即匹配成功,
tree1爲空有兩種情況(1)如果tree1爲空&&tree2不爲空說明不匹配,
(2)如果tree1爲空,tree2爲空,說明匹配。
*/

題目這裏有點問題,應該是空樹是任意一個樹的子樹,按照它的提交咋都不通過。。。

python

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def HasSubtree(self, pRoot1, pRoot2):
        # write code here
        if not pRoot1 or not pRoot2:
            return False
        return self.is_subtree(pRoot1, pRoot2) or self.HasSubtree(pRoot1.left,pRoot2) or self.HasSubtree(pRoot1.right, pRoot2)
     
    def is_subtree(self, A, B):
        if not B:
            return True
        if not A or A.val != B.val:
            return False
        return self.is_subtree(A.left,B.left) and self.is_subtree(A.right, B.right)

c++

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    bool isSubtree(TreeNode* pRootA, TreeNode* pRootB)
    {
        if(!pRootB)return true;
        if(!pRootA)return false;
        if(pRootA->val==pRootB->val)
        {
            if(isSubtree(pRootA->left,pRootB->left)&&isSubtree(pRootA->right,pRootB->right))
                return true;
        }
        return false;
    }
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if(!pRoot2||!pRoot1){return false;}
         
        if(pRoot1->val==pRoot2->val)
        {
            if(isSubtree(pRoot1,pRoot2))
                return true;
        }
        if(HasSubtree(pRoot1->left,pRoot2))
        {
            return true;
        }
        if(HasSubtree(pRoot1->right,pRoot2))
        {
            return true;
        }
        return false;
                
     }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章