天天看點

牛客網-樹的子結構一、題目二、思路三、代碼

一、題目

牛客網-樹的子結構一、題目二、思路三、代碼

二、思路

1)在HasSubtree中,如果pRoot1nullptr || pRoot2nullptr,直接傳回false

2)當pRoot1->val==pRoot2->val時,調用tree函數,進入遞歸

  • tree函數遞歸條件:如果pRoot2==nullptr,傳回true
  • 如果pRoot1==nullptr || pRoot1->val!=pRoot2->val,傳回false;
  • 其餘tree(pRoot1->left,pRoot2->left) && tree(pRoot1->right,pRoot2->right),進入遞歸

3)如果pRoot1中有多個值和pRoot2根節點值相同,則當根節點相等時,調用tree函數進入判斷是否是子樹,同時HasSubtree(pRoot1->left,pRoot2) || HasSubtree(pRoot1->right,pRoot2)進行下一個根節點的比較

4)當根節點值不相同時,HasSubtree(pRoot1->left,pRoot2) || HasSubtree(pRoot1->right,pRoot2)進行左、右子樹和根節點比較

三、代碼

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
        if(pRoot1==nullptr || pRoot2==nullptr)
        {
            return false;
        }
        if(pRoot1->val==pRoot2->val)
        {
            return tree(pRoot1,pRoot2) || HasSubtree(pRoot1->left,pRoot2) || HasSubtree(pRoot1->right,pRoot2);
        }
        else
        {
            return HasSubtree(pRoot1->left,pRoot2) || HasSubtree(pRoot1->right,pRoot2);
        }
    }
    bool tree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if(pRoot2==nullptr)
        {
            return true;
        }
        if(pRoot1==nullptr || pRoot1->val!=pRoot2->val)
        {
            return false;
        }
        return tree(pRoot1->left,pRoot2->left) && tree(pRoot1->right,pRoot2->right);
    }
};
           

繼續閱讀