Problem description: http://oj.leetcode.com/problems/symmetric-tree/

Basic idea: Both recursive and iterative solutions.

Iterative solution:

  1. /**
  2. * Definition for binary tree
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. bool isSymmetric(TreeNode *root) {
  13. // Note: The Solution object is instantiated only once and is reused by each test case.
  14. if(root == NULL)
  15. return true;
  16.  
  17. vector<TreeNode*> layer;
  18. layer.push_back(root);
  19. while(true) {
  20. //determine if the tree is symetric
  21. for(int i = ; i < layer.size()/; i ++ ) {
  22. //layer[i] compare layer[layer.size() - 1 - i]
  23. int right_idx = layer.size() - - i;
  24. if((layer[i]->left == NULL && layer[right_idx]->right == NULL ||
  25. (layer[i]->left != NULL && layer[right_idx]->right != NULL &&
  26. layer[i]->left->val == layer[right_idx]->right->val)) &&
  27. (layer[i]->right == NULL && layer[right_idx]->left == NULL ||
  28. (layer[i]->right != NULL && layer[right_idx]->left != NULL &&
  29. layer[i]->right->val == layer[right_idx]->left->val)))
  30. continue;
  31. else
  32. return false;
  33. }
  34.  
  35. if(layer.size() % != ) {
  36. int middle = layer.size() / ;
  37. if(layer[middle]->left == NULL && layer[middle]->right == NULL ||
  38. (layer[middle]->left != NULL && layer[middle]->right != NULL &&
  39. layer[middle]->left->val == layer[middle]->right->val)){
  40. //do nothing
  41. }else{
  42. return false;
  43. }
  44. }
  45.  
  46. //get node for next layer
  47. vector<TreeNode*> new_layer;
  48. for(auto node : layer) {
  49. if(node->left != NULL)
  50. new_layer.push_back(node->left);
  51. if(node->right != NULL)
  52. new_layer.push_back(node->right);
  53. }
  54. if(new_layer.size() == )
  55. break;
  56.  
  57. layer = new_layer;
  58. }
  59.  
  60. return true;
  61. }
  62. };

Recursive solution: easier to understand.

  1. class Solution {
  2. public:
  3. bool isSubSymmetric(TreeNode * left, TreeNode * right) {
  4. if(left == NULL && right == NULL)
  5. return true;
  6. else if(left != NULL && right == NULL || (right != NULL && left == NULL))
  7. return false;
  8. else if(left->val != right->val)
  9. return false;
  10. else
  11. return isSubSymmetric(left->left, right->right) && isSubSymmetric(left->right, right->left);
  12. }
  13. bool isSymmetric(TreeNode *root) {
  14. // Note: The Solution object is instantiated only once and is reused by each test case.
  15. if(root == NULL)
  16. return true;
  17.  
  18. return isSubSymmetric(root->left, root->right);
  19. }
  20. };

Symmetric Tree [LeetCode]的更多相关文章

  1. Symmetric Tree——LeetCode

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

  2. Symmetric Tree leetcode java

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

  3. Leetcode 笔记 101 - Symmetric Tree

    题目链接:Symmetric Tree | LeetCode OJ Given a binary tree, check whether it is a mirror of itself (ie, s ...

  4. 【LeetCode】Symmetric Tree 推断一棵树是否是镜像的

    题目:Symmetric Tree <span style="font-size:18px;"><span style="font-size:18px; ...

  5. [leetcode] 101. Symmetric Tree 对称树

    题目大意 #!/usr/bin/env python # coding=utf-8 # Date: 2018-08-30 """ https://leetcode.com ...

  6. Leetcode之101. Symmetric Tree Easy

    Leetcode 101. Symmetric Tree Easy Given a binary tree, check whether it is a mirror of itself (ie, s ...

  7. 【leetcode】Symmetric Tree

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

  8. LeetCode之“树”:Symmetric Tree && Same Tree

    Symmetric Tree 题目链接 题目要求: Given a binary tree, check whether it is a mirror of itself (ie, symmetric ...

  9. LeetCode: Symmetric Tree 解题报告

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

随机推荐

  1. 【转载】理解C语言中的关键字extern

    原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻 ...

  2. CUBRID学习笔记23 关键字列表

    先放上特殊的字符 Backtick Symbol - `    反引号 同撇 Double Quotes - "      双引号 Square Brackets - [  中括号 如    ...

  3. C/C++内存泄漏及检测 转

    C/C++内存泄漏及检测 2011-02-20 17:51 by 吴秦, 30189 阅读, 13 评论, 收藏, 编辑 “该死系统存在内存泄漏问题”,项目中由于各方面因素,总是有人抱怨存在内存泄漏, ...

  4. MSDN资料

    http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/Series.aspx http://www.microsoft. ...

  5. JMeter入门合集

    JMeter从入门到精通 http://blog.csdn.net/lihengxin/article/details/4325918 jmeter入门教程- Jmeter教程及技巧汇总 http:/ ...

  6. 在Windows上安装MySQL5.7

    1. 下载安装包,这里选择压缩版mysql-5.7.16-winx64.zip: http://dev.mysql.com/downloads/mysql/ 2. 解压到安装目录,注意最好不要含有中文 ...

  7. 【Todo】Python面试题分析记录(修饰器等)

    首先,看这一段代码: class A(object): x = 1 gen = (lambda t: (t for _ in xrange(10)))(x) if __name__ == '__mai ...

  8. Broadcast Receviewer

    使用Braodcast Receiver 一.新建一个空的工程,命名为LearnBroadcastReceiver 二.为主界面添加一个按钮 三.新建一个broadcast receiver,命名为M ...

  9. TextView使用SpannableString设置复合文本

    TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式.事件方面的设置.Android系统通过SpannableString类来对指定文本进行相关处理,具体有以下功能: 1.Bac ...

  10. 从linux系统mysql导出数据库

    原文:http://blog.csdn.net/lifuxiangcaohui/article/details/50763674 1.MySQL数据库导出 /usr/local/mysql/bin/m ...