剑指offer——26. 树的子结构

26. 树的子结构

NowCoder

题目描述


解题思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
思路: 递归
1、遍历A找到匹配的头
if(pRoot1->val == pRoot2->val)
{
//匹配结构
}

return hasSubtree(pRoot1->left) || hasSubtree(pRoot1->right);
2、匹配判断结构是否相等
bool isSame(TreeNode* p1, TreeNode* p2)
{
//边界条件 p2为空 遍历完了 -》true
if(!p2) return true;
if(!p1 || p1->val != p2->val) return false; //p1为空且p2不为空 或者值不匹配 false
return isSame(p1->left, p2->left) && isSame(p1->right, p2->right)
}
**/

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool hasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
if(!pRoot1 || !pRoot2) return false;
if(pRoot1->val == pRoot2->val)
{
//判断当前分支是否匹配
if( isSame(pRoot1, pRoot2)) return true;
}
return hasSubtree(pRoot1->left, pRoot2) || hasSubtree(pRoot1->right, pRoot2);
}

bool isSame(TreeNode* p1, TreeNode* p2)
{
//边界条件 p2为空 遍历完了 -》true
if(!p2) return true;
if(!p1 || p1->val != p2->val) return false; //p1为空且p2不为空 或者值不匹配 false
return isSame(p1->left, p2->left) && isSame(p1->right, p2->right);
}
};
创作不易,欢迎打赏!
-------------本文结束感谢您的阅读-------------