剑指offer第十七题。

题目描述

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

解题思路

针对树的结构,肯定是要用递归了,本题我觉得还是比较难的,需要注意很多东西,但是理解上比较轻松,直接看代码,理解了就好了。

我的答案

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
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;

public TreeNode(int val) {
this.val = val;

}
}
*/
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean res = false;

//都不为空的话再去判断,因为空树不是任意一个树的子树
if(root1 != null && root2 != null){
//相等,则进入另外一个函数递归判断
if(root1.val == root2.val){
res = doTree1ContainsTree2(root1,root2);
}
//上面个不符合条件的话,则继续找下一个相等的结点,再去遍历
if(!res){
res = HasSubtree(root1.left,root2);
}
if(!res){
res = HasSubtree(root1.right,root2);
}
}
return res;
}

private boolean doTree1ContainsTree2(TreeNode root1,TreeNode root2){
//递归出口1:子树已经判断完毕了则结束,表明整个过程都为true,最终返回true
if(root2 == null){
return true;
}

//递归出口2:子树还没空,父树先走到空了,那么肯定是不是子树结构的
if(root1 == null){
return false;
}

//递归出口3:两个数的结点值不相等的话停止
if(root1.val != root2.val){
return false;
}

//递归
return doTree1ContainsTree2(root1.left,root2.left) && doTree1ContainsTree2(root1.right,root2.right);
}
}