<font color=#000000 size=4 face="System”>判断一个结点是否在二叉树中,遍历树中结点即可作出判断
//结点结构
template<typename T>
struct BinaryTreeNode
{
BinaryTreeNode(const T& data = T())
: _data(data)
, _pLeftChild(NULL)
, _pRightChild(NULL)
{}
T _data;
BinaryTreeNode<T>* _pLeftChild;
BinaryTreeNode<T>* _pRightChild;
};
//判断一个结点是否在二叉树中
bool _NodeInTree(BinaryTreeNode<T>* pRoot ,BinaryTreeNode<T>* Node)
{
if (pRoot == NULL || Node == NULL)
return false;
if (pRoot->_data == Node->_data)
return true;
if (_NodeInTree(pRoot->_pLeftChild),Node)
return true;
if (_NodeInTree(pRoot->_pRightChild),Node)
return true;
}
<font color=#000000 size=4 face="System”>判断一个树是否二叉树的子树,首先判断子树的根是否在二叉树中,然后再做进一步的判断。
具体实现:
//判断树是否在二叉树中
bool SubTreeIsInTree(BinaryTreeNode<T> *pRoot1, BinaryTreeNode<T> *pRoot2)
{
if (pRoot2 == NULL)
return true;
if (pRoot1 == NULL)
return false;
if (pRoot1->_data != pRoot2->_data)
return false;
return SubTreeIsInTree(pRoot1->_pLeftChild, pRoot2->_pLeftChild) && SubTreeIsInTree(pRoot1->_pRightChild, pRoot2->_pRightChild);
}
//首先判断一下树的根是否在二叉树中
bool _HasSubTree(BinaryTreeNode<T> *pRoot1, BinaryTreeNode<T> *pRoot2)
{
bool result = false;
if (pRoot1 != NULL && pRoot2 != NULL)
{
if (pRoot1->_data == pRoot2->_data)//此时根在二叉树中,即做进一步的判断,看树的子节点是否与二叉树中的一致
result = SubTreeIsInTree(pRoot1,pRoot2);
//继续寻找根
if (!result)
result = _HasSubTree(pRoot1->_pLeftChild, pRoot2);
if (!result)
result = _HasSubTree(pRoot1->_pRightChild, pRoot2);
}
return result;
}