题目:你有两颗非常大的二叉树:T1,有几百万个结点;T2,有几百个结点。设计一个算法,判断T2是否为T1的子树。
解法:二叉树中结点太多,遍历结点比较用递归的方法比较合适。如果刚开始根结点相同,就开始比较左右子结点是否相同(注意这个过程不是判断子树的过程,而是严格比较左右子结点是否相等,而不能再往下传递)。如果所有节点比较之后都相等,返回真。否则再去判断T1的左右子树是否包含T2,这一步是递归过程。同时空树是任何树的子树。
bool Compare(BinaryTreeNode* pNode1, BinaryTreeNode* pNode2)
{
if(pNode1 == NULL && pNode2 == NULL)
return true;
if(!pNode1 || !pNode2 || pNode1->m_nValue != pNode2->m_nValue)
return false;
else
return Compare(pNode1->m_pLeft, pNode2->m_pLeft) && Compare(pNode1->m_pRight, pNode2->m_pRight);
}
bool IsSubTree(BinaryTreeNode* pRoot, BinaryTreeNode* pNode)
{
if(pNode == NULL)
return true;
if(pRoot == NULL)
return false;
if(pRoot->m_nValue == pNode->m_nValue)
{
if(Compare(pRoot, pNode))
return true;
}
return IsSubTree(pRoot->m_pLeft, pNode) || IsSubTree(pRoot->m_pRight, pNode);
}