题目
输入两棵二叉树A和B,判断B是不是A的子结构。
例如图中所示的两棵二叉树,由于A中有一部分子树的结构和B 是一样的,因此B是A的子结构。
解题思路
要查找树A中是否存在和树B结构一样的子树,思路是第一步:先在树A中查找与根结点的值一样的结点,这实际就是树的先序遍历,当树A和树B为空时,定义相应的输出。如果树A某一结点的值和树B头结点的值相同,则调用findnext,做第二步判断。第二步是判断树A中以R为根结点的子树是不是和树B具有相同的结构,使用递归的方法考虑:如果结点R和树B的根结点不相同则返回false,如果相同,则递归判断它们的左右结点的值是不是相同。递归终止条件是我们到达树A或者树B的叶结点。
代码如下:
import java.io.IOException;
public class test {
public static void main(String[] args) throws IOException {
TreeNode n1 = new TreeNode(8);
TreeNode n2 = new TreeNode(8);
TreeNode n3 = new TreeNode(7);
TreeNode n4 = new TreeNode(9);
TreeNode n5 = new TreeNode(2);
TreeNode n6 = new TreeNode(4);
TreeNode n7 = new TreeNode(7);
n1.left = n2;
n1.right = n3;
n2.left = n4;
n2.right = n5;
n5.left = n6;
n5.right = n7;
TreeNode m1 = new TreeNode(8);
TreeNode m2 = new TreeNode(9);
TreeNode m3 = new TreeNode(2);
m1.left = m2;
m1.right = m3;
System.out.print(find(n1,m1));
}
public static boolean find(TreeNode f,TreeNode s) {
if(f==null) {
return false;
}
if(s==null) {
return true;
}
boolean res = false;
if(f!=null&&s!=null) {
if(f.data==s.data) {
res = findnext(f, s);
}
if(!res)
res = find(f.left,s)||find(f.right,s);
}
return res;
}
public static boolean findnext(TreeNode f,TreeNode s) {
if(s==null) {
return true;
}
if(f==null) {
return false;
}
if(f.data!=s.data) {
return false;
}
return findnext(f.left,s.left)&&findnext(f.right,s.right);
}
public static class TreeNode{
int data;
TreeNode left;
TreeNode right;
TreeNode(int d){
this.data = d;
left = null;
right = null;
}
}
}