題目詳情
給定一個二叉樹,檢查它是否是鏡像對稱的。
例如,二叉樹 [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;
}
};
結果