二叉树的子树和子结构

定义:

子树:是只要包含了一个结点,就得包含这个结点下的所有节点。

子结构:包含了一个结点,可以只取左子树或者右子树,或者都不取。

 

判断一个二叉树是不是另一个二叉树子树的代码实现如下:

class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if(pRoot1 == NULL || pRoot2 == NULL) return false;
        return ( isSubtree(pRoot1,pRoot2)) || HasSubtree(pRoot1->left, pRoot2) || HasSubtree(pRoot1->right, pRoot2);
    }
private:
    bool isSubtree(TreeNode * r1, TreeNode * r2){
        if(r2 == NULL && r1 == NULL)  return true;//子树必须使得两个部分同时为NULL
        else if(r1!=NULL && r2!=NULL)
        {
            if(r1->val != r2->val)
            {
                return false;
            }
            return isSubtree(r1->left, r2->left) && isSubtree(r1->right, r2->right);    
        }
        else 
            return false;
    }
};

 

判断一个二叉树是不是另一个二叉树子结构的代码实现如下:

class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if(pRoot1 == NULL || pRoot2 == NULL) return false;
        return ( isSubtree(pRoot1,pRoot2)) || HasSubtree(pRoot1->left, pRoot2) || HasSubtree(pRoot1->right, pRoot2);
    }
private:
    bool isSubtree(TreeNode * r1, TreeNode * r2){
        if(r2 == NULL)  return true;
        if(r1 == NULL)  return false;//r2非空,r1为空
        if(r1->val != r2->val)
            return false;
        return isSubtree(r1->left, r2->left) && isSubtree(r1->right, r2->right);
    }
};

 

你可能感兴趣的:(数据结构与算法)