Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree is symmetric:

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

But the following is not:

    1
/ \
2 2
\ \
3 3

Note:
Bonus points if you could solve it both recursively and iteratively.

递归的解法:

新建一个递归调用自身的函数,输入是待比较的左结点和右结点,输出是对称判定结果:true or false;

 class Solution {
public:
bool isSymmetric(TreeNode *root) {
if (!root)
return true; return isSame(root->left, root->right); } bool isSame(TreeNode *node_l, TreeNode *node_r){
if (!node_l && !node_r)
return true; if (!node_l || !node_r)
return false; if (node_l->val != node_r->val){
return false;
} return isSame(node_l->left, node_r->right) && \
    isSame(node_l->right, node_r->left);
} };

迭代的解法:

新建两个栈用于存放待比较的左子树结点和右子树结点。每次迭代拿出两个栈中同位置元素进行比较,结束后删除此比较过的元素,并将其左右儿子压栈待比较。(还有只用一个栈的方法,并没有节省空间,略)

 class Solution {
public:
bool isSymmetric(TreeNode *root) {
if (!root)
return true; stack<TreeNode *> leftNodeStack;
stack<TreeNode *> rightNodeStack;
leftNodeStack.push(root->left);
rightNodeStack.push(root->right);
TreeNode *leftNode;
TreeNode *rightNode; while (!leftNodeStack.empty()) {
leftNode = leftNodeStack.top();
rightNode = rightNodeStack.top();
leftNodeStack.pop();
rightNodeStack.pop(); if (!leftNode && !rightNode) {
continue;
} if ((!leftNode && rightNode) || \
(leftNode && !rightNode)) {
return false;
} if (leftNode->val != rightNode->val) {
return false;
} leftNodeStack.push(leftNode->left);
leftNodeStack.push(leftNode->right);
rightNodeStack.push(rightNode->right); // Notice
rightNodeStack.push(rightNode->left);
}
return true;
}
};

最新文章

  1. 配置WebSite的IIS时遇到的问题与解决方法
  2. Browser设置UA值
  3. MySql数据类型详解
  4. unity缓存和浏览器缓存
  5. 低功耗蓝牙4.0BLE编程-nrf51822开发(2)
  6. 【jQuery UI 1.8 The User Interface Library for jQuery】.学习笔记.3.创建控件
  7. css常用命名规则
  8. 去掉inline-block元素间隙的几种方法
  9. C#部分---特殊集合:stack栈集合、queue队列集合、哈希表集合。
  10. 写多个物件css3循环动画案例原理
  11. 用FSM写Case,玩过没?
  12. iOS UIView非常用方法及属性详解
  13. 排名前10的H5、Js 3D游戏引擎和框架
  14. 使用jQuery修改动态修改超链接
  15. js调DLL类库中的方法实现(非com组件形式)
  16. Swift基础之Delegate方法的使用
  17. 关于linux系统CPU篇---&gt;不容易发现的占用CPU较高进程
  18. 关于文件目录等的特殊权限setuid, setgid , sticky chattr, lsattr
  19. 负载均衡器之 Haproxy
  20. [原创]Fashion汽车定位器拆解

热门文章

  1. 【AC自动机】【字符串】【字典树】AC自动机 学习笔记
  2. fread 快速读入 (神奇挂!)
  3. MySQL Flashback 闪回功能详解
  4. 《The Python Standard Library》——http模块阅读笔记2
  5. Zabbix的安装(源码安装)
  6. java中HashMap的keySet()和values()
  7. BNU 20950 ——沉重的货物 —————— &#183; 最短路、最短边最大化」
  8. Jascript面向对象
  9. Unity手册-Unity概述
  10. 动态添加LInk的分析