树的子结构(树A是否包含树B)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/muzhixi/article/details/89328253

1. 分解为三个子问题,A包含B;A.left包含B;A.right包含B。

    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root1==null||root2==null) return false;
        else{
            boolean flag=false;
            flag=treeContained(root1,root2);//A包含B?
            if(flag) return flag;
            flag=treeContained(root1.left,root2);//A.left包含B?
            if(flag) return flag;
            flag=treeContained(root1.right,root2);//A.right包含B?
            return flag;
        }
    }

2.判断是否包含的函数可以单独写出,父辈结点都相等,并且当前B的结点为空,可以判断包含。

需要注意,这个函数中root2为null时直接返回true,并不是说B为null(前面HasSubtree已经排除了这种情况),而是判断到了B的叶子节点。

    public boolean treeContained(TreeNode root1,TreeNode root2){
        if(root2==null)return true;//判断到叶节点为null,返回true
        else if((root1==null&&root2!=null)) return false;//root1为空,root2不为空,1一定不包含2;
        else{
            if(root1.val!=root2.val) return false;
            else{
                boolean flag=false;
                flag=treeContained(root1.left,root2.left);
                if(!flag) return false;
                flag=treeContained(root1.right,root2.right);
                return flag;
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/muzhixi/article/details/89328253