劍指offer------對稱的二叉樹

題目:

思路:

我們通常有三種不同的二叉樹遍歷算法,即前序遍歷、中序遍歷和後序遍歷。在這三種遍歷算法中,都是先遍歷左子結點再遍歷右子結點。以前序遍歷爲例,我們可以定義一個遍歷算法,先遍歷右子結點再遍歷左子結點,暫且稱其爲前序遍歷的對稱遍歷。

遍歷第一棵樹,前序遍歷的遍歷序列爲{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);
		
	}
};

 

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