二叉树子结构判断问题
问题描述
输入两棵二叉树A和B,判断B是不是A的子结构。
问题分析
和链表相比,树中的指针更多,操作更为复杂;要查找树A中是否存在和树B结构一样的子树,可以分两步:
1、在树A中找到和B的根节点的值一样的结点R;
2、判断树A中以R为根节点的子树是不是包含树B一样的结构。
第一步,在二叉树A中查找与根结点的值一样的结点,实际就是树的遍历。对于二叉树,遍历有两种方式,递归法和循环遍历法。
第二步,判断A中以R为根节点的子树是不是包含树B一样的结构,这个过程其实就是以R为根节点,依次比较两棵树对应的左子树和右子树是否相同,可以采用递归的思想来解决。
本例中:构建前序遍历和中序遍历分别为:8,8,9,2,4,7,7和 9,8,4,2,7,8,7的二叉树A;然后判断是否包含B树的结构
public class Code018 {
public static void main(String[] args){
BinaryTreeNode node1=new BinaryTreeNode(8);
BinaryTreeNode node2=new BinaryTreeNode(8);
BinaryTreeNode node3=new BinaryTreeNode(9);
BinaryTreeNode node4=new BinaryTreeNode(2);
BinaryTreeNode node5=new BinaryTreeNode(4);
BinaryTreeNode node6=new BinaryTreeNode(7);
BinaryTreeNode node7=new BinaryTreeNode(7);
BinaryTreeNode pRoot1=node1;
node1.pLeft=node2;node1.pRight=node7;
node2.pLeft=node3;node2.pRight=node4;
node4.pLeft=node5;node4.pRight=node6;
BinaryTreeNode node8=new BinaryTreeNode(8);
BinaryTreeNode node9=new BinaryTreeNode(9);
BinaryTreeNode node10=new BinaryTreeNode(2);
BinaryTreeNode pRoot2=node8;
node8.pLeft=node9;node8.pRight=node10;
boolean result=HasSubtree(pRoot1,pRoot2);
System.out.println(result);
}
private static boolean HasSubtree(BinaryTreeNode pRoot1,BinaryTreeNode pRoot2){
boolean result=false;
if(pRoot1!=null && pRoot2!=null){
//首先在A中找到与B树根结点相同的节点,然后从该结点开始遍历
if(pRoot1.value==pRoot2.value){
//调用函数判断以该结点为根节点的树是否包含B树
result=DoesTree1HaveTree2(pRoot1,pRoot2);
}
//如果不包含,则分别以该结点的左子节点和右子节点为根节点,递归调用函数进行判断
if(!result){
result=HasSubtree(pRoot1.pLeft,pRoot2);
}
if(!result){
result=HasSubtree(pRoot1.pRight,pRoot2);
}
}
return result;
}
private static boolean DoesTree1HaveTree2(BinaryTreeNode pRoot1, BinaryTreeNode pRoot2) {
if(pRoot2==null){
return true;
}
if(pRoot1==null){
return false;
}
if(pRoot1.value!=pRoot2.value){
return false;
}
//如果两个结点的value相等,则依次遍历两棵树对应的左子节点和右子节点并进行比较。
return DoesTree1HaveTree2(pRoot1.pLeft,pRoot2.pLeft) && DoesTree1HaveTree2(pRoot1.pRight,pRoot2.pRight);
}
private static class BinaryTreeNode{
int value;
BinaryTreeNode pLeft;
BinaryTreeNode pRight;
public BinaryTreeNode() {
}
public BinaryTreeNode(int value) {
this.value = value;
}
}
}