題目:
思路:
我們通常有三種不同的二叉樹遍歷算法,即前序遍歷、中序遍歷和後序遍歷。在這三種遍歷算法中,都是先遍歷左子結點再遍歷右子結點。以前序遍歷爲例,我們可以定義一個遍歷算法,先遍歷右子結點再遍歷左子結點,暫且稱其爲前序遍歷的對稱遍歷。
遍歷第一棵樹,前序遍歷的遍歷序列爲{8,6,5,7,6,7,5},其對稱遍歷的遍歷序列爲{8,6,5,7,6,7,5}。
遍歷第二顆樹,前序遍歷的遍歷序列爲{8,6,5,7,9,7,5},其對稱遍歷的遍歷序列爲{8,9,5,7,6,7,5}。
可以看到,使用此方法可以區分前兩棵樹,第一棵樹爲對稱樹,第二顆樹不是對稱樹。但是當使用此方法,你會發現第三顆樹的前序遍歷和對稱前序遍歷的遍歷序列是一樣的。
怎麼區分第三顆樹呢?解決辦法就是我們也要考慮NULL指針。此時,前序遍歷的遍歷序列{7,7,7,NULL,NULL,7,NULL,NULL,7,7,NLL,NULL,NULL},其對稱遍歷的遍歷序列爲{7,7,NULL,7,NULL,NULL,7,7,NULL,NULL,7,NULL,NULL}。因爲兩種遍歷的序列不同,因此這棵樹不是對稱樹
代碼:
class Solution
{
public:
bool isSymmrtrical(TreeNode* pRoot)
{
if(pRoot == NULL)
{
return NULL;
}
return isSymmrtriacalCor(pRoot,pRoot);
}
private:
bool isSymmrtriacalCor(TreeNode* pRoot1,TreeNode* pRoot2)
{
if(pRoot1 == NULL || pRoot2 == NULL)
return true;
if(pRoot1 == NULL || pRoot2 == NULL)
return false;
if(pRoot1->val != pRoot2->val)
return false;
return isSymmrtriacalCor(pRoot1->left,pRoot2->right) && isSymmrtriacalCor(pRoot1->right,pRoot2->left);
}
};