101. 對稱二叉樹(C++)---DFS解題

題目詳情

給定一個二叉樹,檢查它是否是鏡像對稱的。

 

例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。

    1
   / \
  2   2
 / \ / \
3  4 4  3


但是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的:

    1
   / \
  2   2
   \   \
   3    3

進階:

你可以運用遞歸和迭代兩種方法解決這個問題嗎?


——題目難度:簡單

 




-DFS遞歸版代碼

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(!root) return true;
        return dfs(root->left, root->right);
    }
    
    bool dfs(TreeNode* root1, TreeNode* root2) {
    	if(!root1 && !root2) return true; //兩者都爲 NULL,說明兩個節點是對稱的 
		if(!root1 || !root2) return false; //兩者有其中之一爲 NULL,也就是該二叉樹爲非對稱二叉樹
		if(root1->val != root2->val) return false; //兩者所指向的val不相同,也就是該二叉樹爲非對稱二叉樹
		
		return dfs(root1->left, root2->right) && dfs(root1->right, root2->left);
	}
};

結果



 


 

使用迭代法時,需要了解下queue(線性表)的使用,也就是隊列的使用。

隊列是一種特殊的線性表,是一種先進先出(FIFO)的數據結構。它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲隊頭。隊列中沒有元素時,稱爲空隊列。

 

-使用隊列的迭代版代碼

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(!root) return true;
        
       queue<TreeNode*> que; //隊列擁有"先進先出"的性質 
        que.push(root->left);
        que.push(root->right);
        
        while(!que.empty()) {
        	TreeNode* root1 = que.front(); que.pop();
			TreeNode* root2 = que.front(); que.pop();
			
			/*兩者都爲 NULL,說明兩個節點是對稱的*/
			if(!root1 && !root2) continue;
        	/*兩者有其中之一爲 NULL,也就是該二叉樹爲非對稱二叉樹*/
        	if(!root1 || !root2) return false;
        	/*兩者所指向的val不相同,也就是該二叉樹爲非對稱二叉樹*/
			if(root1->val != root2->val) return false; 
			
			que.push(root1->left); que.push(root2->right);
			que.push(root1->right); que.push(root2->left);
		}
		
		return true;	 
    }
      
};

結果

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