题目:输入两棵二叉树A和B,判断B是不是A的子结构。
思路:
第一步:在树A中找到和树B的根结点的值一样的结点R;实际上就是树的遍历,采用递归的方式遍历。
第二步:在满足第一步的基础上,判断树A中以B为根结点的子树是不是包含和树B一样的结构。
1.如果结点R的值和树B的根结点不同,则以R为根结点的子树和树B肯定不具有相同的结点。
2.如果它们的值相同,则递归地判断它们各自的左右节点的值是不是相同。
递归的终止条件是我们到达了树A或者树B的叶节点。
需要注意的是,每次遍历的时候,应该考虑到遇到null怎么处理
由于计算机表示小数(包括float和double型小数) 都有误差,不能直接用等号(==)判断两个小数是否相等,如果两个小数的差的绝对值很小,比如0.0000001,就可以认为他们相等。
代码:
public static class BinaryTreeNode{
double m_dbValue;
BinaryTreeNode m_pLeft;
BinaryTreeNode m_pRight;
BinaryTreeNode(double m_dbValue){
this.m_dbValue=m_dbValue;
}
}
//在树A中找到和树B的根节点值相同的节点。
public static boolean HasSubtree(BinaryTreeNode pRoot1,BinaryTreeNode pRoot2){
boolean result=false;
if(pRoot1!=null && pRoot2!=null){
if(Equal(pRoot1.m_dbValue,pRoot2.m_dbValue)){
result=DoesTreeHaveTree2(pRoot1,pRoot2);
}
if(!result)
result=HasSubtree(pRoot1.m_pLeft,pRoot2);
if(!result)
result=HasSubtree(pRoot1.m_pRight,pRoot2);
}
return result;
}
public static boolean DoesTreeHaveTree2(BinaryTreeNode pRoot1,BinaryTreeNode pRoot2){
//树B遍历完,说明都能匹配上true
if(pRoot2==null)
return true;
//树B没遍历完,数A就遍历完了 返回false
if(pRoot1==null)
return false;
if(!Equal(pRoot1.m_dbValue,pRoot2.m_dbValue))
return false;
return DoesTreeHaveTree2(pRoot1.m_pLeft,pRoot2.m_pLeft)&&DoesTreeHaveTree2(pRoot1.m_pRight,pRoot2.m_pRight);
}
public static boolean Equal(double num1,double num2){
if(Math.abs(num1-num2)<=0.0000001)
return true;
else
return false;
}
public static void main(String[] args) {
BinaryTreeNode A_node1=new BinaryTreeNode(8);
BinaryTreeNode A_node2=new BinaryTreeNode(8);
BinaryTreeNode A_node3=new BinaryTreeNode(7);
BinaryTreeNode A_node4=new BinaryTreeNode(9);
BinaryTreeNode A_node5=new BinaryTreeNode(2);
BinaryTreeNode A_node6=new BinaryTreeNode(4);
BinaryTreeNode A_node7=new BinaryTreeNode(7);
BinaryTreeNode B_node1=new BinaryTreeNode(8);
BinaryTreeNode B_node2=new BinaryTreeNode(9);
BinaryTreeNode B_node3=new BinaryTreeNode(2);
A_node1.m_pLeft=A_node2;
A_node1.m_pRight=A_node3;
A_node2.m_pLeft=A_node4;
A_node2.m_pRight=A_node5;
A_node5.m_pLeft=A_node6;
A_node5.m_pRight=A_node7;
B_node1.m_pLeft=B_node2;
B_node1.m_pRight=B_node3;
System.out.println(HasSubtree(A_node1,B_node1));
}