一刷劍指offer(18)——樹的子結構

題目:
輸入兩顆二叉樹A和B,判斷B是不是A的子結構。
二叉樹結點的定義如下:
struct BinaryTreeNode
{
    int    m_nValue;
    BinaryTreeNode*    m_pLeft;
    BinaryTreeNode*    m_right;
};

要查找樹A是否存在和樹B結構一樣的子樹,可以分成兩步:

1、在樹A中找到和B根結點的值一樣的結點R

2、判斷樹A中以R爲根結點的子樹是否包含和樹B一樣的結構

bool DoesTree1HaveTree2(BinaryTreeNode* pRoot1,BianryTreeNode* 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);
}

bool HasSubtree(BinaryTreeNode* pRoot1,BinaryTreeNode* pRoot2)
{
    bool result=false;
    if(pRoot1!=NULL && pRoot2!=NULL)
    {
        //找到樹A某結點的值與樹B根結點相同,進行第二步判斷
        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_right,pRoot2);
    }
    return result;
}

二叉樹相關代碼有大量指針操作,每一次使用指針的時候,我們都要檢查指針是否爲NULL,並對NULL的情況進行處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章