剑指Offer-17.树的子结构(C++/Java)

题目:

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

分析:

注意这道题是判断B是不是A的子结构,而不是子树,这一点要注意下,且空树不是任意一个树的子结构。

判断的时候我们要从A树的根节点开始判断B是不是A的结构,递归依次判断B是不是A的左子树和右子树的子结构。

在子结构的判断上,也就是从两个根节点开始判断是否相同,然后递归判断左右节点的val是否相同,当出现B中节点为null的时候,返回true。A中节点为null时,返回false,节点不相同也返回false,多个结果取与。

程序:

C++

class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        bool res = false;
        if(pRoot1 != nullptr && pRoot2 != nullptr){
            res = helper(pRoot1, pRoot2);
            if(!res)
                res = HasSubtree(pRoot1->left, pRoot2);
            if(!res)
                res = HasSubtree(pRoot1->right, pRoot2);
        }
        return res;
    }
    bool helper(TreeNode* p1, TreeNode* p2){
        if(p2 == nullptr)
            return true;
        else if(p1 == nullptr)
            return false;
        else if(p1->val != p2->val)
            return false;
        else
            return helper(p1->left, p2->left) && helper(p1->right, p2->right);
    }
};

Java

public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root1 == null || root2 == null)
            return false;
        /*boolean result = false;
        result = helper(root1, root2);
        if(!result)
            result = HasSubtree(root1.left, root2);
        if(!result)
            result = HasSubtree(root1.right, root2);
        return result;*/
        return helper(root1, root2) || HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);
    }
    public boolean helper(TreeNode root1,TreeNode root2){
        if(root2 == null)
            return true;
        if(root1 == null)
            return false;
        if(root1.val != root2.val)
            return false;
        return helper(root1.left, root2.left) && helper(root1.right, root2.right);
    }
}
原文地址:https://www.cnblogs.com/silentteller/p/11910955.html