題目:
輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
先來理解一下題目 也就是樹A 完全包含樹B
A完全包含B 並且每個節點的值都相同
解題思路:
1.先遍歷一遍A樹找有沒有B的根節點
- 先對比A的根節點與B的根節點是否相同
- 如找不到,在從A的左子樹找有沒有與B根節點相同的
- 如找不到,在從A的右子樹找有沒有與B根節點相同的
- 都沒找到說明B不是A的子結構
2.如果找到了與B的根節點相同的節點
- 然後從A的左子樹每一項與B的左子樹對比,如果有一項不相同直接說明不是子結構
- 如果左子樹完全匹配,在遍歷右子樹的每一項,如果一項不同直接return false
- 如果遍歷左右樹種,出現B遍歷完了,A還沒有直接return true,說明是包含關係
code:
/*
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)
{
bool flag = false;
if(!pRoot1 || !pRoot2)
return false;
////根節點直接相同
if(pRoot1->val == pRoot2->val)
{
flag = tree1HaveTree2(pRoot1,pRoot2);
}
/////左子樹繼續找
if(!flag)
{
flag = HasSubtree(pRoot1->left,pRoot2);
}
/////右子樹繼續找
if(!flag)
{
flag = HasSubtree(pRoot1->right,pRoot2);
}
return flag;
}
bool tree1HaveTree2(TreeNode* node1,TreeNode* node2)
{
////樹2遍歷完成了說明是樹1的字結構
if(node2 == nullptr)
return true;
////樹1遍歷完了 ,說明不是子結構
if(node1 == nullptr)
return false;
bool flag = true;
if(node1->val != node2->val)
return false;
/////繼續匹配左子樹和右子樹
if(flag)
flag = tree1HaveTree2(node1->left,node2->left);
if(flag)
flag = tree1HaveTree2(node1->right,node2->right);
return flag;
}
};