剑指Offer_26_树的子结构
廖家龙 用心听,不照做

题目描述:

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
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)

B是A的子结构, 即A中有出现和B相同的结构和节点值。

例如:

给定的树 A:

     3
    / \
   4   5
  / \
 1   2
 
给定的树 B:

   4 
  /
 1
 
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例:
输入:A = [1,2,3], B = [3,1]
输出:false

输入:A = [3,4,5,1,2], B = [4,1]
输出:true

限制:0 <= 节点个数 <= 10000

解法1:

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
52
53
54
55
56
57
/**
* 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:

//注意:原书中节点值的类型为double,在判断两个节点的值是不是相等时,不能直接写A->val == B->val,这是因为在计算机内表示小数时(float、double)都有误差,判断两个小数是否相等,只能判断它们之差的绝对值是不是在一个很小的范围内,如果两个数相差很小,就可以认为它们相等
bool Equal(double num1,double num2) {

if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001)) {
return true;
} else {
return false;
}
}

bool isSubStructure(TreeNode* A, TreeNode* B) {

bool result = false;

if (A == NULL) return false;
if (B == NULL) return false; //约定空树不是任意一个树的子结构

if (A != NULL && B != NULL) {

if (Equal(A->val,B->val)) {
result = DoesTree1HaveTree2(A,B);
}

if (result == false) {
result = isSubStructure(A->left,B);
}

if (result == false) {
result = isSubStructure(A->right,B);
}
}
return result;
}

bool DoesTree1HaveTree2(TreeNode* A, TreeNode* B) {

//注意:这两行代码不能调换
if (B == NULL) return true;
if (A == NULL) return false;

if (!Equal(A->val,B->val)) return false;

return DoesTree1HaveTree2(A->left,B->left) && DoesTree1HaveTree2(A->right,B->right);
}
};
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
/**
* 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 isSubStructure(TreeNode* A, TreeNode* B) {

bool result = false;

if (A == NULL) return false;
if (B == NULL) return false; //约定空树不是任意一个树的子结构

if (A != NULL && B != NULL) {

if (A->val == B->val) {
result = DoesTree1HaveTree2(A,B);
}

if (result == false) {
result = isSubStructure(A->left,B);
}

if (result == false) {
result = isSubStructure(A->right,B);
}
}
return result;
}

bool DoesTree1HaveTree2(TreeNode* A, TreeNode* B) {

//注意:这两行代码不能调换
if (B == NULL) return true;
if (A == NULL) return false;

if (A->val != B->val) return false;

return DoesTree1HaveTree2(A->left,B->left) && DoesTree1HaveTree2(A->right,B->right);
}
};