题目
输入两棵二叉树A和B,判断B是不是A的子结构。
思路
1)先对A树进行遍历,找到与B树的根结点值相同的结点R;这一步相当于就是树的遍历。
2)判断A树中以R为根结点的子树是否包含和B树一样的结构。同样采用递归的思想:如果节点R的值和树B的根节点不同,则以R为根节点的子树和树B肯定不具有相同的节点;如果他们的值相同,则递归地判断他们各自的左右节点的值是否相同。递归的终止条件是我们到达了树A或者树B的叶节点。
测试用例
1.功能测试(A、B为普通二叉树;B是或者不是A树的子结构)
2.特殊测试(任意一个或者两个树的根结点为null;左斜树;右斜树)
代码
package swordOffer;
public class HasSubtree {
public class TreeNode{
double val;
TreeNode left;
TreeNode right;
public TreeNode(double val) {
this.val = val;
}
}
public static boolean HasSubTree(TreeNode pRoot1, TreeNode pRoot2) {
boolean result = false;
if(Equal(pRoot1.val, pRoot2.val)) {
result = DoesTreeHaveTree2(pRoot1, pRoot2);
}
if(!result) {
result = HasSubTree(pRoot1.left, pRoot2);
}
if(!result) {
result = HasSubTree(pRoot1.right, pRoot2);
}
return result;
}
public static boolean DoesTreeHaveTree2(TreeNode pRoot1, TreeNode pRoot2) {
if(pRoot2 == null) {
return true;
}
if(pRoot1 == null) {
return false;
}
if(!Equal(pRoot1.val, pRoot2.val)) {
return false;
}
return DoesTreeHaveTree2(pRoot1.left, pRoot2.left) && DoesTreeHaveTree2(pRoot1.right, pRoot2.right);
}
public static boolean Equal(double num1, double num2) {
if((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001)) {
return true;
}else {
return false;
}
}
}