当前位置: 首页 > news >正文

Day25-对称二叉树-

对称二叉树

递归法:自己实现一个比较左右节点的函数,然后去递归实现就好了,不过需要注意的是在判断的时候要镜像的判断!

 bool compare(struct TreeNode* left,struct TreeNode* right){if(left == NULL && right == NULL) return true;//如果左右都为空那么只有根节点,一定是对称的else if(left != NULL && right == NULL) return false;else if(right != NULL && left == NULL) return false;else if(right->val != left->val) return false;bool outside = compare(left->left,right->right);bool inside = compare(right->left,left->right);bool isSame = outside && inside;return isSame;}
bool isSymmetric(struct TreeNode* root) {if(root == NULL) return true;return compare(root->left,root->right);
}

使用C语言实现的,C++也一样。

迭代法呢?就是层序遍历!左右节点入栈\队列,然后创建一个新的指针只想他们,如果不是空节点就continue,但凡有一个节点为空或者对应的值不一样直接返回false。

while (!que.empty()) { // 接下来就要判断这两个树是否相互翻转TreeNode* leftNode = que.front(); que.pop();TreeNode* rightNode = que.front(); que.pop();if (!leftNode && !rightNode) { // 左节点为空、右节点为空,此时说明是对称的continue;}
// 左右⼀个节点不为空,或者都不为空但数值不相同,返回falseif ((!leftNode || !rightNode || (leftNode->val != rightNode->val))) {return false;}
……
}

C++写的,C语言就不同了,C语言使用数组去模拟队列

bool isSymmetric(struct TreeNode* root) {if (root == NULL) return true;// 用数组模拟队列struct TreeNode* queue[1000];int left = 0, right = 0;// 初始放入左右子树queue[right++] = root->left;queue[right++] = root->right;while (left < right) {struct TreeNode* leftNode = queue[left++];struct TreeNode* rightNode = queue[left++];if (!leftNode && !rightNode) continue;if (!leftNode || !rightNode || leftNode->val != rightNode->val)return false;// 注意对称入队顺序queue[right++] = leftNode->left;queue[right++] = rightNode->right;queue[right++] = leftNode->right;queue[right++] = rightNode->left;}return true;
}

二叉树的最大深度

说到这,要学习一下什么是二叉树的最大深度和最大高度。

根节点的⾼度就是⼆叉树的最⼤深度

  • 深度(Depth):从 往下数,节点所在的层数(根为第 0 或 1 层,看约定)。

  • 高度(Height):从 节点 往下数,到最远叶子节点的路径长度(叶子节点高度为 0)

递归法:使用三部曲

① 递归终止条件

② 递归参数和返回值

③ 递归逻辑是什么?

把左右节点都递归一下求最大深度+1就好了

int maxDepth(struct TreeNode* root) {  // 求树的高度/最大深度if (!root) return 0;               // 空节点高度为 0int left_height  = maxDepth(root->left);int right_height = maxDepth(root->right);return (left_height > right_height ? left_height : right_height) + 1;
}

迭代法的话代码就长一点了,但是感觉会比较直观,

int maxDepth(struct TreeNode* root) {  // 求树的高度/最大深度if(root == NULL) return 0;struct TreeNode *que[1000];int left = 0,right = 0,depth = 0;que[right++]=root;while(left<right){int size = right - left;depth++;for(int i = 0;i<size;i++){struct TreeNode *node = que[left++] ;//从队列头开始依次把所有节点的子节点加入队列if(node->left) que[right++] = node->left;if(node->right) que[right++] = node->right;}}return depth;
}

C语言实现,其实C++也一样的了,不过使用层序遍历要注意一下,C语言需要使用数组去实现。

不过还是看一下代码随想录的题解,特别细。
 

http://www.dtcms.com/a/311047.html

相关文章:

  • 仿真电路:(十七下)DC-DC升压压电路原理简单仿真
  • Clickhouse#记录隐藏字段
  • 综合:单臂路由+三层交换技术+telnet配置+DHCP
  • 【云计算】云主机的亲和性策略(四):云主机组
  • C 语言问题
  • 【机器学习】两大线性分类算法:逻辑回归与线性判别分析:找到分界线的艺术
  • 复杂路况下漏检率↓78%!陌讯动态决策模型在井盖缺失检测的实战解析
  • 系统性学习数据结构-第一讲-算法复杂度
  • Agents-SDK智能体开发[5]之集成MCP进阶
  • 机器学习 —— 决策树
  • [硬件电路-114]:模拟电路 - 信号处理电路 - 放大器的种类与比较
  • Node.js 路由与中间件
  • [硬件电路-119]:模拟电路 - 信号处理电路 - 比较器,模拟电路中的“决策者”,模拟信号到数字电平逻辑信号的转化者...
  • 音视频学习(四十六):声音的三要素
  • 小迪23-28~31-js简单回顾
  • K8S的Pod之initC容器restartPolicy新特性
  • 强光干扰下识别精度提升28%!陌讯多模态融合算法在油罐车识别的落地实践
  • ubuntu源码编译安装cmake高版本、pybind11安装、crow使用
  • 第3章栈、队列、数组和矩阵
  • 译|Netflix 技术博客:一个利用视觉-语言模型和主动学习高效构建视频分类器的框架
  • 什么叫湖仓一体
  • 一个物理引擎仿真器(mujoco这种)的计算流程
  • ubuntu 系统风扇控制软件 CoolerControl
  • 烽火HG680-KD_海思MV320处理器-安卓9-原厂系统升级包-针对解决烧录不进系统的问题
  • 【Docker】RK3576-Debian上使用Docker安装Ubuntu22.04+ROS2
  • YOLO的Python实现以及 OpenCV
  • 分布式微服务--Nacos作为配置中心(补)关于bosststrap.yml与@RefreshScope
  • 分布式微服务--Nacos作为配置中心(二)
  • 多线程(一) ~ 进程与线程的区别
  • 深入 Go 底层原理(五):内存分配机制