题目描述

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [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

说明:

如果你可以运用递归和迭代两种方法解决这个问题,会很加分。

解题思路

本题可用递归和迭代两种做法来求解。

递归做法是每次对于对称的两个节点,首先判断是否都为空,若都为空则返回true;否则判断两节点是否相等,若相等则返回它们对应的子节点的比较结果;否则返回false。

迭代做法是维护一个节点队列,每次取出队列头部两个节点比较其是否相等,若不相等且两节点均不为空,则依次把两个节点对称位置的子节点加入到队列中,注意null也要加入到队列;否则返回false

代码

递归:

 /**
* 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 == NULL) return true;
return symmetric(root->left, root->right);
}
bool symmetric(TreeNode* left, TreeNode* right){
if(left == right) return true;
else if(left && right && left->val == right->val){
if(symmetric(left->left, right->right) && symmetric(left->right, right->left))
return true;
}
return false;
}
};

迭代:

 /**
* 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 == NULL) return true;
queue<TreeNode*> q;
q.push(root->left);
q.push(root->right);
while(q.size()){
TreeNode* node1 = q.front();
q.pop();
TreeNode* node2 = q.front();
q.pop();
if(node1 && node2){
if(node1->val != node2->val) return false;
else{
q.push(node1->left);
q.push(node2->right);
q.push(node1->right);
q.push(node2->left);
}
}
else if(node1 || node2) return false;
}
return true;
}
};

最新文章

  1. iOS UPYUN(又拍云)使用总结
  2. SAP财务常用数据源概览
  3. char *a 与char a[] 的区别
  4. (未解决)android studio:com.android.support:appcompat-v7:22+ Could not found
  5. Dreamweaver8卡死打开初始化(缓存重建)失败的解决的方法
  6. Dreamweaver PHP代码护眼配色方案
  7. Struts2学习第二天——动态方法调用
  8. 如何选择版本控制系统之二---Git的研发应用场
  9. Xamarin引用第三方包错误解决方法
  10. 驰骋工作流引擎 -Webservice接口说明文档
  11. Getting a handle on
  12. HslCommunication组件库使用说明 (转载)
  13. EMQTT本地源码搭建填坑记录
  14. drozer工具的安装与使用:之一安装篇
  15. TSPL学习笔记(2):过程和变量绑定
  16. eclipse maven install没反应解决办法
  17. VIM学习网址和资料收集
  18. Centos6.9安装JDK1.8
  19. Kotlin新语言简介和快速入门知识点
  20. Oracle常用标准表

热门文章

  1. css选择器找亲戚
  2. 关于google开源的Material Design说明
  3. 三 HashSet
  4. UART串口简介
  5. JAVA语言程序设计课后习题----第六单元解析(仅供参考)
  6. 【异常】azkaban.executor.ExecutorManagerException: No active executors found
  7. Java中Static关键字详解以及静态变量和成员变量的区别
  8. Maven 安装依赖包
  9. python错误大全
  10. git 忽略部分文件