1. 程式人生 > >劍指offer 28: 對稱的二叉樹(遞迴實現)

劍指offer 28: 對稱的二叉樹(遞迴實現)

  • 題目
    實現一個函式,用來判斷一棵二叉樹是不是對稱的。如果一顆二叉樹和它的映象一樣那麼它對稱。

在這裡插入圖片描述

  • 分析
  • 存在三種遍歷演算法,前序遍歷,中序遍歷,後序遍歷。我們可以針對前序遍歷定義一種對稱的遍歷演算法。即先遍歷父節點,再遍歷右結點,最後遍歷左結點。
  • 以上面的為例,先序遍歷為:8 , 6, 5, 7, 6, 7, 5
  • 我們定義的遍歷方式遍歷為: 8 ,6,5, 7, 6 , 7, 5
  • 我們注意到是一樣的。然後再看特殊的例子:
    在這裡插入圖片描述

  • 上圖用前序遍歷 為:7 ,7, 7 , 7, 7 , 7
  • 用定義的遍歷演算法也為: 7, 7, 7, 7, 7, 7
  • 不過他們並不對稱,思考:只要我們把遇到nullptr指標也考慮進來就可以了。

其實也可以有兩種方式解決問題,就像前序遍歷一樣:遞迴和迭代。

遞迴實現:

struct BinaryTreeNode
{
    int             m_nValue;
    BinaryTreeNode* m_left;
    BinaryTreeNode* m_right;
} ;
bool isSymmetrical(BinaryTreeNode* pRoot)
{
    return isSymmetrical(pRoot,pRoot);
}

bool isSymmetrical(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
    if(pRoot1 == nullptr  && pRoot2 == nullptr)
        return true;
    
    if(pRoot1 == nullptr  || pRoot2 == nullptr)
    {
        return false;
    }
    
    if(pRoot1->m_nValue != pRoot2->m_nValue)
        return false;
    
    return isSymmetrical(pRoot1->m_left, pRoot2->m_right) && isSymmetrical(pRoot1->m_right, pRoot2->m_left);
}

想想如何用迴圈、迭代解決!!!