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

来源:互联网 发布:java语言程序设计培训 编辑:程序博客网 时间:2024/06/01 15:08

题目描述:.判断一颗二叉树是是否是另一颗树的子树。比如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 0
原创粉丝点击