import BinaryTree.BinaryTreeNode;
//输入两个棵二叉树A和B,判断B是不是A的子结构。
public class Q18 {
public static void main(String[] args) {
//创建二叉树A的结点
BinaryTreeNode root1 = new BinaryTreeNode();
BinaryTreeNode node1 = new BinaryTreeNode();
BinaryTreeNode node2 = new BinaryTreeNode();
BinaryTreeNode node3 = new BinaryTreeNode();
BinaryTreeNode node4 = new BinaryTreeNode();
BinaryTreeNode node5 = new BinaryTreeNode();
BinaryTreeNode node6 = new BinaryTreeNode();
//二叉树A结点间的结点关系
root1.leftNode = node1;
root1.rightNode = node2;
node1.leftNode = node3;
node1.rightNode = node4;
node4.leftNode = node5;
node4.rightNode = node6;
//对二叉树A赋值
root1.value = 8;
node1.value = 8;
node2.value = 7;
node3.value = 9;
node4.value = 2;
node5.value = 4;
node6.value = 7;
//构建二叉树B的结点
BinaryTreeNode root2 = new BinaryTreeNode();
BinaryTreeNode nodea = new BinaryTreeNode();
BinaryTreeNode nodeb = new BinaryTreeNode();
//二叉树B结点间的关系
root2.leftNode = nodea;
root2.rightNode = nodeb;
//二叉树结点的值
root2.value = 8;
nodea.value = 9;
nodeb.value = 2;
Q18 testQ18 = new Q18();
System.out.println("二叉树A是否包含二叉树B?");
if(testQ18.HasSubTree(root1, root2) == true){
System.out.println("是");
}
else {
System.out.println("否");
}
}
//判断二叉树A是否包含二叉树B,该方法就是寻找A中值等于B的根的值
public static boolean HasSubTree(BinaryTreeNode root1, BinaryTreeNode root2){
boolean result=false;
if(root1 != null && root2 != null){
//A和B根节点值相等时调用Tree1HaveTree2()方法
if(root1.value == root2.value){
result = Tree1HaveTree2(root1, root2);
}
//A的根节点值不等于B的根节点的值,则判断A的左子节点的值是否等于B的根节点的值
if(!result){
result = HasSubTree(root1.leftNode, root2);
}
//A的根节点值不等于B的根节点的值,则判断A的右子节点的值是否等于B的根节点的值
if(!result){
result = HasSubTree(root1.rightNode, root2);
}
}
return result;
}
public static boolean Tree1HaveTree2(BinaryTreeNode root1, BinaryTreeNode root2){
if(root2 == null)
return true;
if(root1 == null)
return false;
if(root1.value != root2.value)
return false;
//在root1.value和root2.value相等的情况递归判断左右子节点的值,在左右子节点值都相等情况下才返回True
return Tree1HaveTree2(root1.leftNode, root2.leftNode)&&
Tree1HaveTree2(root1.rightNode, root2.rightNode);
}
}
//输入两个棵二叉树A和B,判断B是不是A的子结构。
public class Q18 {
public static void main(String[] args) {
//创建二叉树A的结点
BinaryTreeNode root1 = new BinaryTreeNode();
BinaryTreeNode node1 = new BinaryTreeNode();
BinaryTreeNode node2 = new BinaryTreeNode();
BinaryTreeNode node3 = new BinaryTreeNode();
BinaryTreeNode node4 = new BinaryTreeNode();
BinaryTreeNode node5 = new BinaryTreeNode();
BinaryTreeNode node6 = new BinaryTreeNode();
//二叉树A结点间的结点关系
root1.leftNode = node1;
root1.rightNode = node2;
node1.leftNode = node3;
node1.rightNode = node4;
node4.leftNode = node5;
node4.rightNode = node6;
//对二叉树A赋值
root1.value = 8;
node1.value = 8;
node2.value = 7;
node3.value = 9;
node4.value = 2;
node5.value = 4;
node6.value = 7;
//构建二叉树B的结点
BinaryTreeNode root2 = new BinaryTreeNode();
BinaryTreeNode nodea = new BinaryTreeNode();
BinaryTreeNode nodeb = new BinaryTreeNode();
//二叉树B结点间的关系
root2.leftNode = nodea;
root2.rightNode = nodeb;
//二叉树结点的值
root2.value = 8;
nodea.value = 9;
nodeb.value = 2;
Q18 testQ18 = new Q18();
System.out.println("二叉树A是否包含二叉树B?");
if(testQ18.HasSubTree(root1, root2) == true){
System.out.println("是");
}
else {
System.out.println("否");
}
}
//判断二叉树A是否包含二叉树B,该方法就是寻找A中值等于B的根的值
public static boolean HasSubTree(BinaryTreeNode root1, BinaryTreeNode root2){
boolean result=false;
if(root1 != null && root2 != null){
//A和B根节点值相等时调用Tree1HaveTree2()方法
if(root1.value == root2.value){
result = Tree1HaveTree2(root1, root2);
}
//A的根节点值不等于B的根节点的值,则判断A的左子节点的值是否等于B的根节点的值
if(!result){
result = HasSubTree(root1.leftNode, root2);
}
//A的根节点值不等于B的根节点的值,则判断A的右子节点的值是否等于B的根节点的值
if(!result){
result = HasSubTree(root1.rightNode, root2);
}
}
return result;
}
public static boolean Tree1HaveTree2(BinaryTreeNode root1, BinaryTreeNode root2){
if(root2 == null)
return true;
if(root1 == null)
return false;
if(root1.value != root2.value)
return false;
//在root1.value和root2.value相等的情况递归判断左右子节点的值,在左右子节点值都相等情况下才返回True
return Tree1HaveTree2(root1.leftNode, root2.leftNode)&&
Tree1HaveTree2(root1.rightNode, root2.rightNode);
}
}