题目描述:.判断一颗二叉树是是否是另一颗树的子树。比如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;
}