题目详情
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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;
}
};
结果