【二叉树】树的子结构/判断一个节点是否在二叉树中

树的子结构

问题分析
输入两棵二叉树A和B,判断B是不是A的子结构

这里写图片描述

思路:
1、在树A中找到和B根节点值一样的节点R
2、再判断树A中以R节点为根节点的子树是不是包含和树B一样的结构。

代码实现

//步骤1,找一样的节点
bool HasSubTree(TreeNode* pRoot1, TreeNode * pRoot2)
{
    bool res = false;
    if (pRoot1 != NULL && pRoot2 != NULL)
    {
        if (pRoot1->val == pRoot2->val)
            res = DoesTree1HaveTree2(pRoot1, pRoot2);

        //以该节点为根节点的结构不是子树结构
        if (!res)
            res = HasSubTree(pRoot1->left, pRoot2);
        if (!res)
            res = HasSubTree(pRoot1->right, pRoot2);
    }
    return res;
}
//步骤2:在A中找到与B根节点一样的点R,判断是否有一样的结构
//递归的思路来考虑,如果两个根节点相等的话,则判断他们得左右子树是否相等,
//直到到达其中一个数的叶节点
bool DoesTree1HaveTree2(TreeNode* pRoot1, TreeNode * pRoot2)
{
    if (pRoot2 == NULL)//如果B结构到达叶子节点,说明匹配
        return true;
    if (pRoot1 == NULL)//如果A中到达叶子结点,但是B没有到达叶子节点,说明不匹配
        return false;
    if (pRoot1->val != pRoot2->val)
        return false;
    return DoesTree1HaveTree2(pRoot1->left, pRoot2->left)
        && DoesTree1HaveTree2(pRoot1->right, pRoot2->right);
}
变形,判断两个树的结构是否相等

分析:其实这个问题与上一个问题类似,但是相对容易一些。
只是判断两个数的结构是否相等,不考虑到树的节点内容。

bool StructureCmp(Node *pRoot1,Node *pRoot2)
{
    //两个根节点都为空,返回真
    if(pRoot1 == NULL && pRoot2 == NULL)
        return true;
    if(pRoot1 == NULL || pRoot2 == NULL)
        return false;
    bool left = StructureCmp(pRoot1->left,pRoot2->left);
    bool right = StructureCmp(pRoot2->right,pRoot2->right);
    return (left&&right);
}
判断一个节点是否在二叉树中

思路:递归的方法,判断根节,然后 找左子树,找右子树

bool IsInTree(Node* pRoot,Node* find)
{
    if(pRoot == NULL || find == NULL)
        return false;
    if(pRoot == find)
        return true;
    //不是根节点,找左找右
    if(IsInTree(pRoot->left,find))
        return true;
    return IsInTree(pRoot->right,find);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值