剑指Offer-17-树的子结构

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

Code

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
49
50
51
//先找到根节点相同的顶点后,往后开始匹配每个顶点,递归
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/

class Solution {
public:
//判断pRoot2是不是pRoot1的子结构
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
bool result =false;
if(pRoot1!=0&&pRoot2!=0){
//先找到顶点相同的点,判断是否为子结构
if(pRoot1->val==pRoot2->val)
result=isSubTree(pRoot1,pRoot2);

//找左子树
if(!result)
result = HasSubtree(pRoot1->left,pRoot2);

//找右子树
if(!result)
result = HasSubtree(pRoot1->right,pRoot2);

}
return result;
}

//先序遍历看是否满足
bool isSubTree(TreeNode* pRoot1, TreeNode* pRoot2){
//右子树全部匹配玩
if(pRoot2==0)
return true;
//左边已经遍历完而右边还没有遍历完,则匹配失败
if(pRoot1==0)
return false;

if(pRoot1->val !=pRoot2->val)
return false;
//返回递归比较左子树和右子树的结果
return isSubTree(pRoot1->left, pRoot2->left)&&
isSubTree(pRoot1->right, pRoot2->right);
}

};

----\(˙<>˙)/----赞赏一下吧~