1.题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
2.解题思路
递归思想,如果根节点相同则递归调用IsSubtree(),如果根节点不相同,则判断root1的左子树和roo2是否相同,再判断右子树和root2是否相同;
注意节点为空的条件,HasSubTree中,只要有树为空就返回false; IsSubtree中,要先判断root2,如果root2为空,则说明第二棵树遍历完了,即匹配成功。
3.代码
/**
* 题目描述:
* 输入两棵二叉树A,B,判断B是不是A的子结构。
* (ps:我们约定空树不是任意一个树的子结构)
* @author syf
*
*/
public class 树的子结构 {
/**
* 递归思想
* @param A 二叉树
* @param B 子二叉树
* @return
*/
public static boolean isTree(Tree A , Tree B){
if(A == null || B == null){
return false ;
}
/**
* 左子树的根节点和b的根节点作比较,是否相等,同理,右子树一样;
* 如果两个根节点相同的话,就定义一个函数来判断
*/
return isTree(A.left,B)||isTree(A.right, B)||hasTree(A,B) ;
}
private static boolean hasTree(Tree a, Tree b) {
if(b == null){
return true ;
}
if(a == null){
return false ;
}
if(a.data == b.data){
return isTree(a.left,b.left) && isTree(a.right, b.right) ;
}else{
return false ;
}
}
}
//二叉树
class Tree{
Integer data ;
Tree left ;
Tree right ;
public Tree(Integer data){
this.data = data ;
}
}