题目:
输入两个二叉树A和B,判断B是不是A的子结构,二叉树的结构如下:
public class Node{
public Node(int data){
this.data=data;
}
public int data;
public Node leftChild;
public Node rightChild;
}
输入:
树A和树B,他们都是二叉排序树。
输出:
true
解题思路:
先找到树A中和树B根节点的值相同的节点,然后判断树A是否和树B有相同的结构。
java代码实现:
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeNode node=new TreeNode();
node.insert(8);
node.insert(9);
node.insert(2);
node.insert(4);
node.insert(7);
node.insert(10);
TreeNode node2=new TreeNode();
node2.insert(8);
node2.insert(2);
node2.insert(4);
boolean a=HashSubTree(node.root, node2.root);
System.out.println(a);
}
public static boolean HashSubTree(Node root,Node root2){
boolean result=false;
//边界查询,反之出现空指针
if(root!=null && root2!=null){
if(root.data==root2.data){
result=DoesTree(root, root2);
}
if(!result){
result=HashSubTree(root.leftChild, root2);
}
if(!result){
result=HashSubTree(root.rightChild, root2);
}
}
return result;
}
//如果节点1和节点2不相同,那么返回false,否则判断他们的左子树和右子树是否相同,终结条件为是否到达了两个节点的叶节点,
//我们首先判断节点2是否到达了叶节点,到达了叶节点也就意味着他是树1的子节点,接着我们判断如果节点2没有到达叶节点,而
//节点1到达了叶节点返回false,显然两者是不相同的。
public static boolean DoesTree(Node node1,Node node2){
if(node2==null){
return true;
}
if(node1==null){
return false;
}
if( node1.data!=node2.data){
return false;
}
return DoesTree(node1.leftChild, node2.leftChild) && DoesTree(node1.rightChild, node2.rightChild);
}