树的子结构
剑指offer第26题
代码看不懂的话可以看我注释,如果还是没有的话,直接去看剑指offer。
贴代码:
public class Main {
Node root;
boolean HashSubtree(Node root1,Node root2){
boolean result=false;
/**
* 每次都是从根开始遍历,如果根相同,才继续向下比较
*/
if(Equal(root1.data,root2.data)){
result= DoesTree1HaveTree2(root1,root2);
}
/**
* (想了好一大会才明白下面这两个result为什么要判断result为false呢,
* 原来如果从一开始根节点的值不一样的话,就重新开始比较新的根的第一个节点)
*/
if(!result){
result= HashSubtree(root1.left,root2);
}
if (!result){
result= HashSubtree(root1.right,root2);
}
return result;
}
/**
* 判断两个节点的值是不是相等的
*/
boolean DoesTree1HaveTree2(Node root1,Node root2){
/**
* 遍历到了第二个节点的末尾
*/
if(root2==null){
return true;
}
/**
* root2不为null,证明root2这个树还没有遍历完,
* root1这个树已经遍历完,所以两棵树不相同,返回false
*/
if(root1==null){
return false;
}
//真正的比较两个树的节点的值是否相同,如果不相等,则返回false
if(!Equal(root1.data,root2.data)){
return false;
}
return DoesTree1HaveTree2(root1.left,root2.left)&&DoesTree1HaveTree2(root1.right,root2.right);
}
//比较两个节点的值是否相等
boolean Equal(double num1,double num2){
if((num1-num2>-0.0000001)&&(num1-num2<0.0000001)){
return true;
}else{
return false;
}
}
}
class Node{
int data;
Node left;
Node right;
Node(int data){
this.left=null;
this.right=null;
}
}