《剑指offer》刷题——【代码的鲁棒性】面试题26:树的子结构(java实现)
一、题目描述
输入两棵二叉树A和B,判断B是不是A的子结构。
二、题目分析
1. 过程:
- 第一步:在树A中找到和树B的根节点的值一样的节点R
- 第二步:判断树A中以R为根节点的子树是不是包含和树B一样的结构(左子树、右子树)
2. 易出错之处:
- 每次使用指针,都要判断是否可能会存在空指针,若存在,如何处理
- 若树A和树B的头节点有一个或者两个都为空
- 若树A和树B中所有节点都只有左子节点或者右子节点
- 若树A和树B中含有分叉
- 节点中的值类型为double,不能使用==来判断(有精度误差)
- 判断两个double值相等:由于计算机表示小数都有误差,不能直接用==判断两个小数是否相等,如果两个小数的差的绝对值很小,就可以认为他们相等
三、代码实现
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean result = false;
if(root1!=null && root2!=null){
if(Equal(root1.val, root2.val)){
result = DoesTree1HaveTree2(root1,root2);
}
if(!result){
result = HasSubtree(root1.left, root2);
}
if(!result){
result = HasSubtree(root1.right, root2);
}
}
return result;
}
public boolean DoesTree1HaveTree2(TreeNode root1, TreeNode root2){
if(root2 == null){
return true;
}
if(root1 == null){
return false;
}
if(!Equal(root1.val, root2.val)){
return false;
}
return DoesTree1HaveTree2(root1.left, root2.left)&& DoesTree1HaveTree2(root1.right, root2.right);
}
public boolean Equal(double num1, double num2){
if(((num1-num2)> -0.0000001) && ((num1-num2)<0.0000001)){
return true;
}
else{
return false;
}
}
}