Symmetric Tree

原题链接Symmetric Tree

判断给定的二叉树和自身是否成镜像关系

以二叉树根节点为中心做垂线,两边正好是相反的才叫镜像,以两个值为2的节点leftNode和rightNode为例

需要满足

  • leftNode->val == rightNode->val;
  • leftNode->left->val == rightNode->right->val;
  • leftNode->right->val == rightNode->left->val;

当然,使用递归是比较方便的,从根节点开始向下,逐个比较,即如果满足leftNode->val == rightNode->val,那么,需要让他们的子节点也同样满足镜像规则,只需要递归

isSymmetric(leftNode->left, rightNode->right) &&
isSymmetric(leftNode->right, rightNode->left);

每次进入isSymmetric函数时,参数的两个节点都来自根节点的两边,所以可以判断是否是镜像

代码如下

/*** 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) {return !root || isSymmetric(root->left, root->right);  }
private:bool isSymmetric(TreeNode* leftNode, TreeNode* rightNode){if(!leftNode && !rightNode) return true;if((leftNode && !rightNode) || (!leftNOde && rightNode))    return false;if(leftNode->val != rightNode->val) return false;return isSymmetric(leftNode->left, rightNode->right) && isSymmetric(leftNode->right, rightNode->left);}
};

迭代法只是简单的用队列维护遍历到的节点,思路都一样

代码如下

/*** 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*> lq, rq;lq.push(root->left);rq.push(root->right);while(!lq.empty() && !rq.empty()){TreeNode* leftNode = lq.front();TreeNode* rightNode = rq.front();lq.pop();rq.pop();if(!leftNode && !rightNode) continue;if((leftNode && !rightNode) || (!leftNode && rightNode))    return false;if(leftNode->val != rightNode->val) return false;lq.push(leftNode->left);rq.push(rightNode->right);lq.push(leftNode->right);rq.push(rightNode->left);}return lq.empty() && rq.empty();}
};

递归还是比较容易写出的,需要注意镜像是在根节点两边对称,而不是每个节点的左右子树对称,递归时传入的参数要注意

每天一道LeetCode-----判断二叉树左右两边是否成镜像关系相关推荐

  1. 二叉树层次遍历c语言_每日一道 LeetCode (23):二叉树的层次遍历 II

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  2. LeetCode LCP 07. 传递信息 / NC111 最大数 / NC16 判断二叉树是否对称 / NC13 二叉树的最大深度

    祝我党百年华诞生日快乐 LCP 07. 传递信息 2021.7.1 每日一题 题目描述 小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下:有 n 名玩家,所有玩家编号分别为 0 - n-1 ...

  3. 【leetcode】二叉树与经典问题

    文章目录 笔记 leetcode [114. 二叉树展开为链表](https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list ...

  4. 一天一道LeetCode(61-90)

    一天一道LeetCode(61-90) 文章目录 一天一道LeetCode(61-90) 61.旋转链表 62.不同路径 63.不同路径 II 64.最小路径和 65.有效数字(未解决) 66.加一 ...

  5. 牛客题霸 [判断二叉树是否对称] C++题解/答案

    [牛客题霸 [判断二叉树是否对称] C++题解/答案](https://www.nowcoder.com/practice/1b0b7f371eae4204bc4a7570c84c2de1?tpId= ...

  6. c++判断二叉树是否为二叉搜索树_原创 | 好端端的数据结构,为什么叫它SB树呢?...

    点击上方蓝字,关注并星标,和我一起学技术. 大家好,今天给大家介绍一个很厉害的数据结构,它的名字就很厉害,叫SB树,业内大佬往往叫做傻叉树.这个真不是我框你们,而是它的英文缩写就叫SBT. SBT其实 ...

  7. atoi函数_每日一道 LeetCode (50):字符串转换整数 (atoi)

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  8. c++两个数组对比去掉重复的元素_每日一道 LeetCode (8):删除排序数组中的重复项和移除元素...

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  9. 力扣(LeetCode)236. 二叉树的最近公共祖先(C语言)

    一.环境说明 本文是 LeetCode 236. 二叉树的最近公共祖先,使用c语言实现. 递归. 测试环境:Visual Studio 2019. 二.代码展示 精简代码: struct TreeNo ...

最新文章

  1. java可以调用python程序吗_我们可以从java调用python方法吗?
  2. 回顾2013 - 技术上
  3. DevOps笔记-02:DevOps与微服务之间是什么关系?
  4. 爬取股票信息(股票代码+价格)
  5. 基于 KubeVela 与 Kubernetes 打造“无限能力”的开放 PaaS
  6. 学习Struts--Chap02:Struts2框架各个功能模块和程序执行流程的介绍
  7. HDU-4793 Collision 计算几何 解方程
  8. leetcode74. 搜索二维矩阵 ,你见过吗
  9. 百度地图迁徙大数据_百度地图大数据:五一高速拥堵不似预期,广深成热门迁出入地...
  10. 排序——宇宙总统(洛谷 P1781)
  11. mssql 无法启动调试器 数据为空_Windows无法启动:如何利用PE拯救桌面重要数据?...
  12. Android学习总结(5)——9个非常有用的Andorid 程序片段
  13. 西南科技大学OJ题 数字转换成字符0613
  14. Python数据可视化三部曲之 Pyecharts 从上手到上头
  15. 基于stm32f103的俄罗斯方块游戏
  16. 简单几步解决ie打不开闪退的问题 亲测有效
  17. apicloud转uniapp_uni-app,wex5,APPcan,ApiCloud几款国内webapp开发框架的选型对比
  18. html5 圆圈扩散,CSS3地图动态实例代码(圆圈向外扩散)
  19. innerHTML用法
  20. R语言数据可视化教程(ggplot2)_绘制散点图

热门文章

  1. python最小值函数_Python3 min() 函数详解 获取多个参数或列表中的最小值
  2. Java黑皮书课后题第7章:*7.13(随机数选择器)编写一个方法,返回1到54之间的随机数,但不能是传递到实参中的数。指定如下方法头
  3. C语言学习之输入一个大于三的值判断是否为素数
  4. N*N匹马,N个赛道,求出最快N匹马的解法
  5. OpenCV C++ 02 - Create a Blank Image Display
  6. 爸爸我爱您(之十二)
  7. 有关“优秀工作流引擎”的评价
  8. ArcGIS Server 简介
  9. 牛客网(剑指offer) 第十九题 顺时针打印矩阵
  10. 操作系统实验报告11:ucore Lab 2