Q18:树的子结构

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);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值