题目:
输入两棵二叉树A和B,判断B是不是A的子结构。
代码:
//给定的树结点类型
class BinaryTreeNode
{
public:
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
/*
函数功能:判断pRoot1中是否有pRoot2的子结构
1、先找到pRoot1中是否有和pRoot2中相同值的根节点
2、如果有相同的根节点,那么我们调用DoesTree1HaveTree2来判断二者的子树结构是否相同
*/
bool HasSubTree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
bool result = false;
if ( pRoot1 != NULL && pRoot2 != NULL )
{
if ( pRoot1->m_nValue == pRoot2->m_nValue )
result = DoesTree1HaveTree2(pRoot1, pRoot2);
if ( !result )
result = HasSubTree(pRoot1->m_pLeft, pRoot2);
if ( !result )
result = HasSubTree(pRoot1->m_pRight, pRoot2);
}
return result;
}
bool DoesTree1HaveTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
if ( pRoot2 == NULL )
return true;
if ( pRoot1 == NULL )
return false;
if ( pRoot1->m_nValue != pRoot2->m_nValue )
return false;
return ( DoesTree1HaveTree2(pRoot1->m_pLeft,pRoot2->m_pLeft) &&
DoesTree1HaveTree2(pRoot1->m_pRight,pRoot2->m_pRight) );
}
难点:
写两个递归去解决问题,有点绕;
写递归时,递归出口判断条件比较多,要考虑情况较多。