判断一颗二叉树是是否是另一颗树的子树。

题目描述:.判断一颗二叉树是是否是另一颗树的子树。比如tree2是tree1的子树。

**难点分析:
要判断树2是否是树1中的节点,就需要遍历树1中节点与树2根结点比较。如果相同,则树1,树2同时遍历比较。两棵树进行两层遍历,对于技巧要求较高。

思路:
将过程分为两步:
1,通过递归,在树1中每次给出一个节点。
2,通过递归,在树2中判断该结点所在树是否与树2一样。

实现代码:

//节点信息:
struct BinaryTreeNode
{
    BinaryTreeNode(const T& data)
        :m_data(data)
        , m_pLeft(nullptr)
        , m_pRight(nullptr)
    {}
    T m_data;
    BinaryTreeNode<T>* m_pLeft;//左孩子
    BinaryTreeNode<T>* m_pRight;//右孩子
};

//判断t2是否是t1的子树
bool BinaryTree<T>::_IsSubTree(Node* t1, Node* t2)
{
    if (nullptr == t2) //子树t2可以为空(不管t1是否为空)
        return true;

    if (nullptr == t1) //此时子树t2不为空,t1为空表示没有子树
        return false;

    if (_IsSameTree(t1, t2))  //判断t1、t2两颗树是否相同
        return true;

    //走到这里,说明不同,则在t1的左右子树中判断
    return (_IsSubTree(t1->m_pLeft, t2) || _IsSubTree(t1->m_pLeft, t2));
}

//判断两颗树中节点的值是否相同
bool BinaryTree<T>::_IsSameTree(Node* t1, Node* t2)
{
    if (nullptr == t1 && nullptr == t2)  //都为空,相等。
        return true;

    if (nullptr == t1 || nullptr == t2) //一个空,一个不空,不相等
        return false;

    //此时两者都不为空,

    //判断节点值是否相同
    if (t1->m_data == t2->m_data) //如果相同,则判断左右子树是否相同。
        return (_IsSameTree(t1->m_pLeft, t2->m_pLeft) && _IsSameTree(t1->m_pRight, t2->m_pRight));

    //两个节点不相同,则t1,t2不相等
    return false;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值