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

代码随想录Day15_二叉树

1.平衡二叉树

题目理解:

左子树和右子树的高度差不超过1。
求左子树高度,求右子树高度,如果差1或者0就返回true.至于高度.
不能用求最大深度做,因为最大深度中高度的相加是通过最后1+max() 实现的.
image
题目理解错了,平衡二叉树,说的是所有节点的左子树和右子树的高度差,并非是根节点。在看对称二叉树时,判断的是根节点的左右子树的情况。因此参数一定是节点。

题目思路

不懂为什么要引出高度和深度以及遍历方式?
先三部曲:
1.参数是节点,返回值是高度,int;
2.终止条件:节点空
3.单层循环的逻辑:左右子树的差值。

代码实现

class Solution {
public:bool isBalanced(TreeNode* root) {return GetHi(root)==-1? false:true;}int GetHi(TreeNode* node){if(node==NULL)   return 0;int leftH = GetHi(node->left);int rightH = GetHi(node->right);if(leftH == -1)  return -1;if(rightH == -1)  return -1;return abs(rightH-leftH)>1? -1:1+max(rightH,leftH);}

2.二叉树的所有路径

题目理解

根节点到叶子经过的所有节点。

思路

对于一个节点,要是有左节点,就输出来,要是有右节点就输出来,直到没有左节点,也没有右节点。用动态数组存。

代码

class Solution {
public:vector<string> binaryTreePaths(TreeNode* root) {vector<int>path;vector<string>result;if(root ==NULL) return result;Tranverse(root,path,result);return result;}
private:void Tranverse(TreeNode* node,vector<int>&path,vector<string> &result){path.push_back(node->val);if(node->left==NULL&&node->right==NULL){string spath;for(int i=0;i<path.size()-1;i++){spath += to_string(path[i]); spath +="->";}spath+=to_string(path[path.size()-1]);result.push_back(spath);//return ;}if(node->left){Tranverse(node->left,path,result);path.pop_back();}if(node->right){Tranverse(node->right,path,result);path.pop_back();}}
};

3.左叶子之和

题目理解

是左叶子!是没有孩子的节点,不是左节点!
叶子节点:如果已经遍历到了叶子节点,那么就不知道它是否是左节点,因此参数是叶子节点的上一个节点。

思路

1.参数 TreeNode node 返回值 int;
2.终止条件:root==NULL;
3.单层循环:遇见左叶子,记录左叶子;

  • 递归求左子树叶子和;
  • 递归求右子树叶子和;
  • 返回和。

代码

class Solution {
public:int sumOfLeftLeaves(TreeNode* root) {return tranverse(root);}int tranverse(TreeNode* node){if(node == NULL) return 0;int leftNum =tranverse(node->left);if(node->left!=0&&node->left->left==NULL&&node->left->right==NULL)leftNum+=node->left->val;//左int rightNum =tranverse(node->right);//右int sum =leftNum+rightNum;//中return sum;}};

3.完全二叉树节点的数量

题目理解

思路

这个递归真是完全不理解,为什么要确定一个终止条件后还要再写一个判断满二叉树,满二叉树是为了简化。

代码

class Solution {
public:int countNodes(TreeNode* root) { return GetNum(root); }
private:int GetNum(TreeNode* node) {if (node == NULL)return 0;int leftDepth = 0;int rightDepth = 0;TreeNode* LeftNode=node->left;while (LeftNode) {LeftNode = LeftNode->left;leftDepth++;}TreeNode* RightNode = node->right;while (RightNode) {RightNode = RightNode->right;rightDepth++;}if(leftDepth == rightDepth) {return (2<<leftDepth)-1;}int leftNum = GetNum(node->left);int rightNum = GetNum(node->right);int sum = leftNum + rightNum+1;return sum;}
};
http://www.jsqmd.com/news/45039/

相关文章:

  • 2025农膜厂商最新top推荐:三光膜/ 大棚膜/水池布优质供应商
  • 什么是代币?从ERC-20开始 - all-in
  • NCHU-OOP-前三次大作业总结 - AC
  • Yanhua Mini ACDP-2 BMW CAS Package: Advanced CAS ISN Module Programming for N20/N55/B38
  • NCHU-OO-前三次大作业总结 - AC
  • Postman关于AES的加解密
  • 汉诺塔问题详解
  • 20232307 2025-2026-1 《网络与系统攻防技术》实验七实验报告
  • 《R语言医学数据分析实战》学习记录--第一章 R语言介绍
  • 251119明天就要去适应比赛场地了
  • 【数据结构】哈希表的理论与实现 - 教程
  • pip安装第三方包
  • 李克特量表(Likert scale)
  • java---maven
  • 新来的外包,在大群分享了它的限流算法的实现
  • 状语从句学案
  • 用 Rust 与 Tesseract 进行英文数字验证码识别
  • 详细介绍:开源AI大模型、AI智能名片与S2B2C商城系统:个体IP打造与价值赋能的新范式
  • ThreadLocal 源码解析
  • 黑马程序员SpringCloud微服务开发与实战- Docker项目部署-03
  • C# 和 Tesseract 实现英文数字验证码识别
  • contig 和 scaffold的区别和联系
  • linux ftp自动
  • linux ftp脚本
  • 实用指南:【案例实战】鸿蒙分布式智能办公应用的架构设计与性能优化
  • Yanhua Mini ACDP-2 BMW ECU Package: EUC Clone License with Modules 3/8/27 Bench Interface Board
  • Yanhua Mini ACDP-2 BMW ECU Package: EUC Clone License with Modules 3/8/27 Bench Interface Board
  • 根据图片路径将文件下载到本地
  • 2025雅思一对一提分攻略:5家靠谱机构适配不同基础学员
  • redis-RDB/AOF-主从复制整理 - 指南