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

题目:输入两棵二叉树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指针、二叉树的所有结点都没有左子树或者右子树)

发布了118 篇原创文章 · 获赞 35 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/abc7845129630/article/details/52724765