您的位置:首页 > Web前端

剑指offer:树的子结构(java)

2016-10-02 20:13 393 查看
题目:输入两棵二叉树A和B,判断B是不是A的子结构。

例如图中所示的两棵二叉树,由于A中有一部分子树的结构和B 是一样的,因此B是A的子结构。



要查找树A中是否存在和树B结构一样的子树,思路是第一步:先在树A中查找与根结点的值一样的结点,这实际就是树的先序遍历,当树A和树B为空时,定义相应的输出。如果树A某一结点的值和树B头结点的值相同,则调用doesTree1HaveTree2,做第二步判断。第二步是判断树A中以R为根结点的子树是不是和树B具有相同的结构,使用递归的方法考虑:如果结点R和树B的根结点不相同则返回false,如果相同,则递归判断它们的左右结点的值是不是相同。递归终止条件是我们到达树A或者树B的叶结点。

public boolean hasSubTree(BinaryTreeNode root1,BinaryTreeNode root2){
if(root2 == null)
return true;
if(root1 == null)
return false;
boolean result = false;

if(root1 != null && root2 != null){
if(root1.value == root2.value)
result = doesTree1HaveTree2(root1,root2);
if(!result)
result = hasSubTree(root1.leftNode,root2);
if(!result)
result = hasSubTree(root1.rightNode ,root2);
}
return result;
}
public boolean doesTree1HaveTree2(BinaryTreeNode root1,BinaryTreeNode root2){
if(root2 == null)
return true;
if(root1 == null)
return false;
if(root1.value != root2.value)
return false;
return doesTree1HaveTree2(root1.leftNode,root2.leftNode) && doesTree1HaveTree2(root1.rightNode,root2.rightNode);
}
测试用例:

功能测试(树A和树B都是普通的二叉树,树B是或不是树A的子结构)

特殊输入测试(两课二叉树的一个或者两个根结点为NULL指针、二叉树的所有结点都没有左子树或者右子树)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息