劍指offer 28: 對稱的二叉樹(遞迴實現)
阿新 • • 發佈:2018-11-26
- 題目
實現一個函式,用來判斷一棵二叉樹是不是對稱的。如果一顆二叉樹和它的映象一樣那麼它對稱。
- 分析
- 存在三種遍歷演算法,前序遍歷,中序遍歷,後序遍歷。我們可以針對前序遍歷定義一種對稱的遍歷演算法。即先遍歷父節點,再遍歷右結點,最後遍歷左結點。
- 以上面的為例,先序遍歷為: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); }
想想如何用迴圈、迭代解決!!!