leetcode刷题第十三天——二叉树Ⅲ

news2025/2/22 2:50:16

本次刷题顺序是按照卡尔的代码随想录中给出的顺序

翻转二叉树

226. 翻转二叉树

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

/*总体思路就是,对于每一个结点,将其左右孩子结点对换*/

struct TreeNode* invertTree(struct TreeNode* root) {
    if(root == NULL) return NULL;
    struct TreeNode* tmp;
    //交换左右子树
    tmp = root->left;
    root->left = root->right;
    root->right = tmp;
    //在对左右子树分别进行翻转
    root->left = invertTree(root->left);
    root->right = invertTree(root->right);
    return root;
}

对称二叉树

d101. 对称二叉树

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

/*总体思路,对于当前结点而言,其左孩子与右孩子的结点值相同
 *左孩子的(左、右)孩子的结点值与右孩子的(右、左)孩子的结点值相同*/

bool isSymmetree(struct TreeNode* p, struct TreeNode* q) {
    if(p == NULL && q == NULL) return true;
    else if(p != NULL && q != NULL) {
        return (p->val == q->val && isSymmetree(p->left, q->right) \
        && isSymmetree(p->right, q->left));
    }else {
        return false;
    }
}

bool isSymmetric(struct TreeNode* root) {
    return isSymmetree(root->left, root->right);
}

相同的树

100. 相同的树

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

/*对于两棵树,相同则说明,对于两棵树中每个相应的结点,其值必须相同
 *结点的左、右孩子也必须完全相同*/

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p == NULL && q == NULL) return true;
    else if(p != NULL && q != NULL) {
        return (p->val == q->val && isSameTree(p->right, q->right) \
        && isSameTree(p->left, q->left));
    }else {
        return false;
    }
}

另一颗树的子树

572. 另一棵树的子树

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

/*建立在“判断两棵树是相同的树”的基础之上,
 *总体思路:如果以当前结点为根的树与指定树subRoot相同,则直接返回true
 *否则,分别查看以当前结点的左、右孩子结点为根的树与subRoot是否相同,有则返回true
 *否则,返回false*/

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p == NULL && q == NULL) return true;
    else if(p != NULL && q != NULL) {
        return (p->val == q->val && isSameTree(p->left, q->left) && \
        isSameTree(p->right, q->right));
    }else return false;
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {
    if(isSameTree(root, subRoot)) return true;
    if(root != NULL) {
        return (isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot));
    }else return false;
}

二叉树的最大深度

104. 二叉树的最大深度

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

/*利用层序遍历的框架,即可统计最大深度,因为内层循环就是遍历一层的结点,外层循环就是遍历所有层,
 *故而,每进行依次外层循环,层数加1,跳出外层循环后,返回层数即为最大深度*/

int maxDepth(struct TreeNode* root) {
    if(root == NULL) return 0;
	struct TreeNode** st = malloc(sizeof(struct TreeNode*) * 10001);
    struct TreeNode* tmp;
    int rear = -1, mid_rear, front = -1, sum = 0;
    st[++rear] = root;
    mid_rear = rear;
    while(rear != front) {
        while(mid_rear != front) {
            tmp = st[++front];
            //判断子树是否需要入队列
            if(tmp->left) st[++rear] = tmp->left;
            if(tmp->right) st[++rear] = tmp->right;
        }
        sum++;
        mid_rear = rear;
    }
    return sum;
}

二叉树的最小深度

111. 二叉树的最小深度

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

/*也是建立在层次遍历的基础之上,如果内层循环在遍历当前层结点时,
 *出现某个结点左、右子树均为NULL,则直接返回当前层的深度*/

int minDepth(struct TreeNode* root) {
    if(root == NULL) return 0;
	struct TreeNode** st = malloc(sizeof(struct TreeNode*) * 100001);
    struct TreeNode* tmp;
    int rear = -1, mid_rear, front = -1, sum = 0;
    st[++rear] = root;
    mid_rear = rear;
    while(rear != front) {
        sum++;
        while(mid_rear != front) {
            tmp = st[++front];
            //判断子树是否需要入队列
            if(tmp->left) st[++rear] = tmp->left;
            if(tmp->right) st[++rear] = tmp->right;
            if(!tmp->left && !tmp->right) return sum;
        }
        mid_rear = rear;
    }
    return sum;
}

完全二叉树的结点个数

222. 完全二叉树的节点个数

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

/*利用满二叉树的性质进行求解
 *当前结点,如果左、右深度一致,说明是满二叉树,直接由公式得到节点数
 *如果左、右深度不一致,则返回左子树结点数+右子树结点数+1
 *
 *为什么可以这么做?因为,完全二叉树除了最后一层未满,其它层均是满的*/

int countNodes(struct TreeNode* root) {
    if(root == NULL) return 0;
    struct TreeNode* l_child = root->left, * r_child = root->right;
    int l_cnt = 0, r_cnt = 0;
    while(l_child != NULL) {
        l_cnt++;
        l_child = l_child->left;
    }
    while(r_child != NULL) {
        r_cnt++;
        r_child = r_child->right;
    }
    //若向左和向右遍历深度一致,说明是满二叉树,可以直接求解结点个数
    if(l_cnt == r_cnt) return (2  <<  l_cnt) - 1;
    else return (countNodes(root->left) + countNodes(root->right) + 1);
}

平衡二叉树

110. 平衡二叉树

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

/*对于每个结点,求其左右子树的高度
 *所有结点,左右子树高度差不应超过1*/

//求得树的高度
int treeDeepth(struct TreeNode* p) {
    if(p == NULL) return 0;
    else return fmax(treeDeepth(p->left), treeDeepth(p->right)) + 1;
}

bool isBalanced(struct TreeNode* root) {
    if(root == NULL) return true;
    //对于当前结点,两棵子树的高度差小于等于1,则判断结点的左右子树是否为平衡二叉树
    if(fabs(treeDeepth(root->left) - treeDeepth(root->right)) <= 1) {
        return isBalanced(root->left) && isBalanced(root->right);
    }else return false;//对于当前结点,两棵子树的高度差大于1,则直接返回错误
}

左叶子之和

404. 左叶子之和

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
int sumOfLeftLeaves(struct TreeNode* root) {
    //如果为空,则必定返回0
    if(root == NULL) return 0;
    //如果当前结点的左孩子左右子树均为空,则当前结点的左孩子是左叶子
    if(root->left != NULL && root->left->left == NULL && root->left->right == NULL) {
        return root->left->val + sumOfLeftLeaves(root->right);
    }else {//如果当前结点左孩子为空,或者其左孩子左右子树不为空
        return sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);
    }
}

找树左下角的值

513. 找树左下角的值

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

/*找最左下结点的值,依照层次遍历的框架,最后一层的第一个结点就是最左下的结点*/

int findBottomLeftValue(struct TreeNode* root) {
    struct TreeNode** qu = malloc(sizeof(struct TreeNode*) * 10000);
    struct TreeNode* tmp;
    int rear = -1, mid_rear, front = -1, res;
    qu[++rear] = root;
    do {
        mid_rear = rear;
        res = qu[front + 1]->val;
        while(front != mid_rear) {
            tmp = qu[++front];
            if(tmp->left) qu[++rear] = tmp->left;
            if(tmp->right) qu[++rear] = tmp->right;
        }
    }while(rear != front);
    return res;
}

最大二叉树

654. 最大二叉树

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

/*按照先序遍历的思想,先构造根节点,再构造左子树,最后构造右子树
 *需要配合查找数组最大值下标的程序进行构造*/

int FindMaxIdx(int* nums, int start, int end) {
    int idx = start, max = INT_MIN, max_idx;
    while(idx <= end) {
        if(nums[idx] > max) {
            max = nums[idx];
            max_idx = idx;
        }
        idx++;
    }
    return max_idx;
}

struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize) {
    if(numsSize == 0) return NULL;
    int max_idx = FindMaxIdx(nums, 0, numsSize - 1);
    struct TreeNode* root = malloc(sizeof(struct TreeNode));
    root->val = nums[max_idx];
    root->left = constructMaximumBinaryTree(nums, max_idx);
    root->right = constructMaximumBinaryTree(nums + max_idx + 1, numsSize - max_idx - 1);
    return root;
}

合并二叉树

617. 合并二叉树

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

/*在遍历过程中,两个结点均存在,则返回结点值为两者之和,
 *只有一者存在,直接返回该结点,
 *两者均不存在,则直接返回NULL*/

struct TreeNode* mergeTrees(struct TreeNode* root1, struct TreeNode* root2) {
    if(root1 == NULL && root2 == NULL) return NULL;
    struct TreeNode* root = malloc(sizeof(struct TreeNode));
    if(root1 != NULL && root2 != NULL) {
        root->val = root1->val + root2->val;
        root->left = mergeTrees(root1->left, root2->left);
        root->right = mergeTrees(root1->right, root2->right);
    }else {
        if(root1 != NULL) {
            root = root1;
        }else root = root2;
    }
    return root;
}

递归用得挺多的,后面可以尝试迭代算法的实现。

递归需要考虑,递归的终止条件是什么?递归程序的单层逻辑是什么?

需要熟练掌握二叉树的四种遍历方式的框架,一般都是以此为突破口进行编程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2302211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在高流量下保持WordPress网站的稳定和高效运行

随着流量的不断增加&#xff0c;网站的稳定和高效运行变得越来越重要&#xff0c;特别是使用WordPress搭建的网站。流量过高时&#xff0c;网站加载可能会变慢&#xff0c;甚至崩溃&#xff0c;直接影响用户体验和网站正常运营。因此&#xff0c;我们需要采取一些有效的措施&am…

Cython学习笔记1:利用Cython加速Python运行速度

Cython学习笔记1&#xff1a;利用Cython加速Python运行速度 CythonCython 的核心特点&#xff1a;利用Cython加速Python运行速度1. Cython加速Python运行速度原理2. 不使用Cython3. 使用Cython加速&#xff08;1&#xff09;使用pip安装 cython 和 setuptools 库&#xff08;2&…

web的分离不分离:前后端分离与不分离全面分析

让我们一起走向未来 &#x1f393;作者简介&#xff1a;全栈领域优质创作者 &#x1f310;个人主页&#xff1a;百锦再新空间代码工作室 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[1504566…

记录一个ES分词器不生效的解决过程

问题背景 商城项目,其中商品查询检索使用的是ES, 但存在某些商品查询不到的问题 例如:某商品名包含AA_BBB这样的关键词,但是搜索"AA"不能查询到该商品,但是将商品名修改为AA BBB后就能查询到了. 怀疑是分词的问题,但看代码,在创建ES索引时在对应字段上也定义了分词器…

高性能内存对象缓存Memcached详细实验操作

目录 前提准备&#xff1a; cache1&#xff0c;2&#xff1a; 客户端cache-api&#xff08;一定得是LAMP环境&#xff09; memcache实现主主复制以及高可用(基于以上完成) cache1,2: memcachekeepalived(基于以上完成) cache1,2: 前提准备&#xff1a; 1. 准备三台cent…

css之display:grid布局改块级元素布局

1.问题&#xff1a; div是块级元素&#xff0c;一个div元素占一行&#xff0c;但是&#xff0c;今天测试样式时&#xff0c;总是会有两个div并占一行&#xff0c;很困惑&#xff0c;结果发现是app这个样式 在main.css里 #app样式布局在main.ts里被应用 2.原因以及样式分析 im…

推荐一个github star45k+进阶的java项目及知识的网站

mall是github上star 45k的一个java项目 mall项目是一套电商系统&#xff0c;包括前台商城系统及后台管理系统&#xff0c;基于SpringBootMyBatis实现&#xff0c;采用Docker容器化部署。 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心…

第2章 深入理解Thread构造函数

Thread的构造函数。 2.1 线程的命名 在构造一个Thread时可以为其命名。 2.1.1 线程的默认命名 下面构造函数中&#xff0c;并没有为线程命名。 Thread() Thread(Runnable target) Thread(ThreadGroup group, Runnable target)打开源码会看到 public Thread(Runnable targe…

node 使用 Redis 缓存

缓存是什么&#xff1f; 高并发下&#xff0c;一个项目最先出问题的&#xff0c;并不是程序本身&#xff0c;而是数据库最先承受不住。 在数据库上我们可以做很多优化&#xff0c;例如优化 SQL 语句&#xff0c;优化索引&#xff0c;如果数据量大了&#xff0c;还可以分库、分表…

PMBOK第7版整体架构全面详解

1. 引言 7月1日对于项目管理从业者和研究者而言&#xff0c;是个非凡意义的一个时间&#xff0c;这一天&#xff0c;翘首以待的《 项 目管理知识体系指南 》&#xff08;PMBOK&#xff09;第七版终于发布了。 总体而言&#xff0c;PMBOK第七版集百家之所长&#xff0c;成一…

【Scrapy】Scrapy教程6——提取数据

前一小节我们拿到了页面的数据,那页面中那么多内容,我们想要其中的部分内容,该如何获取呢?这就需要对我们下载到的数据进行解析,提取出来想要的数据,这节就讲讲如何提取数据。 引入 我们编辑保存下来的shouye.html文件看下,发现这是什么鬼,全是如下图的代码。 没错…

golang panic信息捕获

背景 我们的日志接入阿里云sls平台&#xff0c;但是&#xff0c;日志是以json的格式存储在阿里云sls平台上&#xff0c;程序中产生的error,info等日志都可以实现以json的格式打印。但是&#xff0c;golang程序中产生的panic信息本身不是以json的格式输出&#xff0c;这就导致p…

一周学会Flask3 Python Web开发-http响应状态码

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在Flask程序中&#xff0c;客户端发出的请求触发相应的视图函数&#xff0c;获取返回值会作为响应的主体&#xff0c;最后生成…

goland无法debug项目

1、其实个原因是因为正在使用的Delve调试器版本太旧&#xff0c;无法兼容当前的Go语言版本1.2。Delve是Go语言的一个调试工具&#xff0c;用于提供源码级别的调试功能。Go语言每隔一段时间会发布新版本&#xff0c;而相应的调试器Delve也可能会更新以提供新的特性或修复已知问题…

Python VsCode DeepSeek接入

Python VsCode DeepSeek接入 创建API key 首先进入DeepSeek官网&#xff0c;https://www.deepseek.com/ 点击左侧“API Keys”&#xff0c;创建API key&#xff0c;输出名称为“AI” 点击“创建"&#xff0c;将API key保存&#xff0c;复制在其它地方。 在VsCode中下载…

Ubuntu22.04.6如何固定ip地址

Ubuntu22.04.6如何固定ip地址 主要参见这篇博客 ubuntu 桌面版如何设置固定IP地址_ubuntu桌面版如何修改ip-CSDN博客 1.先查看一下当前的IP是多少

腿足机器人之十- SLAM地图如何用于运动控制

腿足机器人之十- SLAM地图如何用于运动控制 腿足机器人SLAM地图的表示与处理全局路径规划&#xff1a;地形感知的路径搜索基于A*的三维路径规划基于RRT*的可行步态序列生成 局部运动规划&#xff1a;实时步态调整与避障动态窗口法的腿足适配模型预测控制&#xff08;MPC&#x…

毕业项目推荐:基于yolov8/yolov5/yolo11的果蔬检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

pyside6学习专栏(二):程序图像资源的加载方式

pyside6中的QLabel控件可以加载图像和gif动画&#xff0c;可以直接从外部文件加载&#xff0c;也可以从QRC类型的文件(实际是一脚本文件)经编绎生成对应的资源.PY模块文件(就是将qrc文本中指定的资源文件的16制内容写入.py文件)来使用&#xff0c;本文对两种方式作了一简单的示…

如何在 VS Code 中快速使用 Copilot 来辅助开发

在日常开发中&#xff0c;编写代码往往是最耗时的环节之一。而 GitHub Copilot&#xff0c;作为一款 AI 编码助手&#xff0c;可以帮助开发者 自动补全代码、生成代码片段&#xff0c;甚至直接编写完整的函数&#xff0c;大幅提升编码效率。那么&#xff0c;如何在 VS Code 中快…