首页 > 代码库 > 树的子结构

树的子结构

题目:
输入两棵树A和B。推断B是不是A的子结构
比如:右边的便是左边的子结构

           8                        4
         /   \                    /          4     9                  2    5
       /       2   5

二叉树我们非常easy会想到递归,这里我们的思路是:
先找到两棵二叉树同样的某一节点,然后依次递归深入,推断两棵树是否拥有共同的子结构就可以。

public static boolean hasSubtree(BinaryTree rootOne,BinaryTree rootTwo)
    {
        boolean result=false;
        if(rootOne!=null&&rootTwo!=null)
        {
            if(rootOne.value==rootTwo.value)
                result = HasSameTree(rootOne,rootTwo);
            if(!result)
                result = hasSubtree(rootOne.left,rootTwo);
            if(!result)
                result = hasSubtree(rootOne.right,rootTwo);
        }


        return result;
    }



    private static boolean HasSameTree(BinaryTree rootOne, BinaryTree rootTwo) {
         //假设是第二个为空,说明已经第二个遍历完成,则肯定是子结构
        if(rootTwo==null)return true;
        //在第二个还没有遍历完的时候第一个已经完了,那么肯定不是子结构
        if(rootOne==null)return false;
        if(rootOne.value != rootTwo.value)
            return false;

        return HasSameTree(rootOne.left,rootTwo.left)&&HasSameTree(rootOne.right,rootTwo.right);

    }

为了方便观看,我们能够输出二叉树的前序和中序遍历验证是否为子结构。

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

树的子结构