1.题目
输入两棵二叉树A和B,判断B是不是A的子结构
2 .思路
step1:判断A树中是否含有B树的根节点R
step2:判断对应根节点下两棵子树是否相等
注意:判断浮点数相等不能直接用 “==“ 判断。
3.代码实现
public class HasSubtree {
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
public TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean isEquals=false;
if(root1!=null&&root2!=null){
if(equals(root1,root2)){
isEquals=doesTree1HasTree2(root1, root2);
}
if(!isEquals){
isEquals=HasSubtree(root1.left,root2);
}
if(!isEquals){
isEquals=HasSubtree(root1.right,root2);
}
}
return isEquals;
}
private boolean doesTree1HasTree2(TreeNode root1, TreeNode root2) {
if(root2==null){
return true;
}
if(root1==null){
return false;
}
if(!equals(root1,root2)){
return false;
}
return doesTree1HasTree2(root1.right,root2.right)&&doesTree1HasTree2(root1.left,root2.left);
}
public boolean equals(TreeNode root1,TreeNode root2){
if(root1.val-root2.val<0.0000001&&root1.val-root2.val>-0.0000001){
return true;
}
return false;
}
//正常功能测试
@Test
public void test1() {
TreeNode treeNode1 = new TreeNode(8);
TreeNode treeNode2 = new TreeNode(8);
TreeNode treeNode3 = new TreeNode(7);
TreeNode treeNode4 = new TreeNode(9);
TreeNode treeNode5 = new TreeNode(2);
TreeNode treeNode6 = new TreeNode(4);
TreeNode treeNode7 = new TreeNode(7);
treeNode1.left=treeNode2;
treeNode1.right=treeNode3;
treeNode2.left=treeNode4;
treeNode2.right=treeNode5;
treeNode5.left=treeNode6;
treeNode5.right=treeNode7;
TreeNode tree2Node1 = new TreeNode(8);
TreeNode tree2Node2 = new TreeNode(9);
TreeNode tree2Node3 = new TreeNode(2);
tree2Node1.left=tree2Node2;
tree2Node1.right=tree2Node3;
boolean isExist=HasSubtree(treeNode1,tree2Node1);
System.out.println(isExist);
}
//A树只有一个节点
@Test
public void test2() {
TreeNode treeNode1 = new TreeNode(8);
TreeNode tree2Node1 = new TreeNode(8);
TreeNode tree2Node2 = new TreeNode(9);
TreeNode tree2Node3 = new TreeNode(2);
tree2Node1.left=tree2Node2;
tree2Node1.right=tree2Node3;
boolean isExist=HasSubtree(treeNode1,tree2Node1);
System.out.println(isExist);
}
//A树为空
@Test
public void test3() {
TreeNode tree2Node1 = new TreeNode(8);
TreeNode tree2Node2 = new TreeNode(9);
TreeNode tree2Node3 = new TreeNode(2);
tree2Node1.left=tree2Node2;
tree2Node1.right=tree2Node3;
boolean isExist=HasSubtree(null,tree2Node1);
System.out.println(isExist);
}
}