问题描述

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

例如,二叉树 [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   示例 1: 输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2: 输入:root = [1,2,2,null,3,null,3]
输出:false
  限制: 0 <= 节点个数 <= 1000

代码(递归)

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root)return true;
return fun(root->left,root->right);
}
bool fun(TreeNode* node1,TreeNode* node2)
{
if(!node1 && node2)return false;
if(node1 && !node2)return false;
if(!node1 && !node2)return true;
if(node1->val != node2->val)return false;
return fun(node1->left,node2->right) && fun(node1->right,node2->left);
}
};

结果:

执行用时 :4 ms, 在所有 C++ 提交中击败了92.33%的用户
内存消耗 :16.4 MB, 在所有 C++ 提交中击败了100.00%的用户

代码(非递归)

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root)return true;
queue<TreeNode*> q1,q2;
q1.push(root->left);
q2.push(root->right);
while(!q1.empty() && !q2.empty())
{
TreeNode* node1,*node2;
node1 = q1.front();q1.pop();
node2 = q2.front();q2.pop();
if(!node1 && node2)return false;
if(node1 && !node2)return false;
if(!node1 && !node2)continue;
if(node1->val != node2->val)return false;
q1.push(node1->left);q1.push(node1->right);
q2.push(node2->right);q2.push(node2->left);//注意顺序
}
return true;
}
};

结果:

执行用时 :12 ms, 在所有 C++ 提交中击败了33.23%的用户
内存消耗 :16.9 MB, 在所有 C++ 提交中击败了100.00%的用户

最新文章

  1. Linux(三)__文件权限、系统的查找、文本编辑器
  2. android wifi 获取扫描结果
  3. Java读写文件通用格式
  4. swift 定制自己的Button样式
  5. Webpack使用教程二
  6. (转)QRCODE二维码介绍及常用控件推荐
  7. Intellij IDEA 导入Eclipse或MyEclipse的Web项目(旧版 转载)
  8. Codeforces 527D Clique Problem
  9. 用Iconv应对NodeJs对称加密技术在汉字编码与NoSQL的一些坑洞
  10. ECSTORE1.2系统更改后台密码
  11. DateTime格式
  12. Java中的双重检查锁(double checked locking)
  13. [Luogu3527][POI2011]MET-Meteors
  14. prev_permutation(a+1,a+n+1)
  15. There is no session with id XXX
  16. requirejs案例
  17. zabbix 报警方式之 邮件报警(4)
  18. Web API使用记录系列(二)HelpPage优化与WebApiTestClient
  19. JavaScript经常使用代码段
  20. maven学习5 构建MyBatis项目

热门文章

  1. Python3的数据类型
  2. 关于Marshal 类的整理
  3. Jenkins安装部署使用图文详解(非常详细)
  4. 8-1yum私有云仓库
  5. byte数组(byte[])与MultipartFile相互转化
  6. 【LeetCode】223. Rectangle Area 解题报告(Python)
  7. 【LeetCode】687. Longest Univalue Path 解题报告(Python & C++)
  8. MySQL 尽量避免使用 TIMESTAMP
  9. 主流的 API 架构
  10. 【MySQL作业】MySQL函数——美和易思字符串函数应用习题