代码随想录(七) —— 二叉树部分

1. 二叉树的四种遍历方式的理解

前序遍历,中序遍历,后序遍历;层次遍历

结合另一篇博客,关于灵神的题单刷题

二叉树刷题记录-CSDN博客 

理解:

        在二叉树类型题目中,遍历顺序的选择需要根据具体问题来确定。以下是四种常见的遍历方式及其特点:

一、前序遍历(根左右)

1. 特点:
   - 可以在遍历过程中较早地访问根节点,对于需要先处理根节点信息的问题比较适用。
   - 常用于需要快速确定整棵树的某些特征,比如构建二叉树的副本、判断两棵二叉树是否相等、求二叉树的深度等问题。

2. 应用场景示例:
   - 构建二叉树的副本:先复制根节点,再递归复制左右子树。
   - 判断两棵二叉树是否相等:比较根节点的值,然后递归判断左右子树是否相等。

二、中序遍历(左根右)

1. 特点:
   - 对于二叉搜索树 BST,中序遍历可以得到有序的节点值序列。
   - 在一些需要按特定顺序处理节点的问题中很有用,比如求二叉搜索树的中序后继节点。

2. 应用场景示例:
   - 验证二叉搜索树:通过中序遍历得到的序列应该是升序的。
   - 求二叉搜索树的第 k 小值:利用中序遍历的有序性,依次计数找到第 k 个节点。

三、后序遍历(左右根)

1. 特点:
   - 可以在处理完左右子树后再处理根节点,对于需要在处理完子树后进行一些清理工作计算依赖于子树结果的问题比较合适。
   - 常用于计算二叉树的高度、直径等问题。

2. 应用场景示例:
   - 计算二叉树的高度:先计算左右子树的高度,再加上根节点自身的高度。
   - 释放二叉树的内存:先递归释放左右子树的内存,再释放根节点的内存。

四、层序遍历

  1. 特点

    • 从上到下、从左到右依次访问每一层的节点。
  2. 适用场景

    • 当需要按层次顺序访问二叉树的节点时,层序遍历是合适的选择。
    • 在一些图形相关的问题中,如广度优先搜索等,层序遍历可以提供一种按层次处理节点的方式。

此外,还有层序遍历等方式,可根据问题需求灵活选择遍历顺序。在解决二叉树问题时,要充分理解不同遍历方式的特点和适用场景,以便选择最合适的遍历顺序来高效地解决问题。

2. 翻转二叉树

226. 翻转二叉树

遍历顺序分析:

        思路是翻转一个节点的左右孩子,处理逻辑应该放在左右孩子之前或之后,所以可以使用前序或者后序遍历,不能使用中序遍历,否则一个节点会翻转两次;比如左孩子翻转之后变成了右孩子,然后右孩子又翻转了一次变成了左孩子。在本题中层序遍历也可以使用。

递归三部曲:(1)确定递归函数的参数与返回值 (2)确定终止条件(3)确定单层递归的逻辑

class Solution {public TreeNode invertTree(TreeNode root) {preOrder(root);return root;}public void preOrder(TreeNode root) {if(root == null) return; TreeNode tmp = root.right;root.right = root.left;root.left = tmp;preOrder(root.left);preOrder(root.right);}
}
//  使用栈来模拟前序遍历:因为前序遍历是根左右顺序,所以入栈方式应当为先入根节点,再加入右节点,最后左节点;
//  这样遍历出来的方式才是根左右
class Solution {
public:TreeNode* invertTree(TreeNode* root) {if(root == NULL) return root;stack<TreeNode*> st;st.push(root); while(!st.empty()) {TreeNode* node = st.top();st.pop();  // 遍历中// 遍历出中了就进行中节点的操作TreeNode* tmp = node->right;node->right = node->left;node->left = tmp;if(node->right) st.push(node->right);if(node->left) st.push(node->left);} return root;}
};

3. 二叉树的最大深度

104. 二叉树的最大深度

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)

遍历顺序分析:

        求二叉树的最大深度就是在求根节点的高度,根节点的高度等于左右子树高度的最大值+1;很显然,这里在处理节点时需要有左右节点的高度,所以最好的选择是使用后序遍历。

class Solution {
public:int maxDepth(TreeNode* root) {/*后序遍历*/return postOrder(root);}
private:// 返回当前节点的高度int postOrder(TreeNode* root) {if(root == NULL) {return 0;} int left = postOrder(root->left);int right = postOrder(root->right);// 处理当前节点高度return max(left,right) + 1;}
};

        也可以使用层序遍历解决;即二叉树的最大深度即层序遍历的层数

代码

559. N 叉树的最大深度

待办

4. 二叉树的最小深度

111. 二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

注意:这里有一个坑点,即最小高度并不是左右子树的最小高度 + 1; 因为可能左子树都没有孩子,自然就没有叶子节点了,此时如果按照这种方式计算的话那二叉树的高度会为1,但实际上不是。

所以这里需要把这种情况去掉:

        当左子树为空,右子树不为空时,此时该节点最小深度 = 右子树的最小深度 + 1;

        当右子树为空,左子树不为空时,此时该节点最小深度 = 左子树的最小深度 + 1;

        当左右子树都不是空的时候,此时该节点最小深度 = 左右子树中的最小深度 + 1;

        递归终止情况,当该节点为叶子节点时,返回1; 或者是该节点为null时返回0,表示没有节点的树最小深度为0。

遍历方式分析

因为在处理节点时需要用到左右子树的信息,所以可以采用后序遍历。

class Solution {
public:int minDepth(TreeNode* root) {return postOrder(root);}
private:int postOrder(TreeNode* root) {if(root == NULL) return 0;int leftMin = postOrder(root->left);int rightMin = postOrder(root->right);// 处理逻辑if(root->left == NULL && root->right != NULL) {return rightMin + 1;}if(root->left != NULL && root->right == NULL) {return leftMin + 1;}return min(leftMin, rightMin)  + 1; // 叶子节点 以及 左右子树都存在的节点 其返回值都是这个}
};

5. 完全二叉树的节点数

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

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

遍历顺序分析:

对于普通的一颗二叉树

        递归的思想:二叉树的节点数目 = 左子树的节点数 + 右子树的节点数 + 1;

        层序遍历的思想:就是一层一层的遍历,直到队列变空

class Solution {
public:int countNodes(TreeNode* root) {/*后序遍历*/return postOrder(root);}private: // 返回子树的高度int postOrder(TreeNode* root) {if(root == NULL) {return 0;}int left = postOrder(root->left);int right = postOrder(root->right);return left + right + 1;}
};
class Solution {
public:/*层序遍历*/int countNodes(TreeNode* root) {if(root == NULL) return 0;queue<TreeNode*> que;que.push(root);  // --> 准备op: 建队并根节点入队int res = 0;while(!que.empty()) { int size = que.size();  // 控制每一层的遍历次数for(int i=0; i< size; i++) {TreeNode* node = que.front();que.pop(); // 元素出队res ++; // 记录节点数目if(node -> left) que.push(node->left);if(node -> right) que.push(node -> right); // 左右孩子节点入队}}return res;}
}; 

 二叉树的所有路径

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

猎板PCB:军工武器系统中的PCB线路板技术要求

PCB线路板在军工武器系统中的应用非常广泛&#xff0c;它们是现代军事装备中不可或缺的组成部分。军工级PCB因其在极端环境下的稳定性和可靠性而受到重视&#xff0c;这些环境可能包括高温、低温、高湿度、强辐射、高震动等条件。以下是一些关键点&#xff0c;概述了PCB线路板在…

本地部署ComfyUI并添加强大的Flux.1开源文生图模型远程制作AI图片

文章目录 前言1. 本地部署ComfyUI2. 下载 Flux.1 模型3. 下载CLIP模型4. 下载 VAE 模型5. 演示文生图6. 公网使用 Flux.1 大模型6.1 创建远程连接公网地址7. 固定远程访问公网地址前言 本文将详细介绍如何在本地部署ComfyUI并搭建 Flux.1文生图神器,并且实现公网访问。 Flux…

c++实现boost库 搜索引擎(详细介绍和代码),cppjieba的下载和使用,正排/倒排索引的查询和建立,cpp-httplib的下载和使用

目录 boost库 搜索引擎 项目背景 引入 表现形式 boost库介绍 项目环境 数据源 下载文档 页面目录 查看html文件的数量 技术栈 原理 过程 正排/倒排索引 正排索引 分词 暂停/停止词 倒排索引 模拟查找过程 parser模块 读取文件 标签 如何存放 代码编写思…

从零创建苹果App应用,不知道怎么申请证书的可以先去看我的上一篇文章

用大家自己的开发者账户&#xff0c;登录进入App Store Connect ,注册自己的应用 进入之后&#xff0c;点击增加 填写相关的信息 一切顺利的话&#xff0c;就可以来到这个页面

智能AI对话绘画二合一源码系统 内置所有大模型的接口 带完整的安装代码包以及搭建部署教程

系统概述 人工智能技术的飞速发展&#xff0c;越来越多的创新应用正在改变着我们的生活。本文将向大家介绍一款集成了智能对话与创意绘画功能的开源项目——“智能AI对话绘画二合一源码系统”。它不仅融合了最新的自然语言处理&#xff08;NLP&#xff09;和计算机视觉技术&am…

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 目录 AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 一、简单介绍 二、Docker 下载安…

线上游戏 线下陪玩线下家政陪聊陪诊陪游系统多少钱

关于线上游戏、线下陪玩、线下家政、陪聊、陪诊、陪游等系统的价格&#xff0c;由于这些服务涉及多个不同的行业和领域&#xff0c;且每个行业内部的定价也会因服务内容、服务质量、服务地区、服务提供商等多种因素而有所不同&#xff0c;因此很难给出一个统一的答案。 一般来…

【Linux】解读信号的本质&相关函数及指令的介绍

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

[Linux#62][TCP] 首位长度:封装与分用 | 序号:可靠性原理 | 滑动窗口:流量控制

目录 一. 认识TCP协议的报头 1.TCP头部格式 2. TCP协议的特点 二. TCP如何封装与分用 TCP 报文封装与解包 如何封装解包&#xff0c;如何分用 分离有效载荷 隐含问题&#xff1a;TCP 与 UDP 报头的区别 封装和解包的逆向过程 如何分用 TCP 报文 如何通过端口号找到绑…

HNU-并行算法设计与分析-期末考查报告

《并行算法设计与分析》期末考查题实现与分析报告 by 甘晴void 1 题目重述 Consider a sparse matrix stored in the compressed row format (you may find a description of this format on the web or anysuitable text on sparse linear algebra). Write an OpenMP progra…

UE4 材质学习笔记08(雨滴流淌着色器/雨水涟漪着色器)

一.雨滴流淌着色器 法线贴图在红色通道和绿色通道上&#xff0c;那是法线的X轴和Y轴&#xff0c;在蓝色通道中 我有个用于雨滴流淌的蒙版&#xff0c;在Alpha通道中&#xff0c;有个时间偏移蒙版。这些贴图都是可以在PS上制作做来的&#xff0c;雨滴流淌图可以直接用笔刷画出来…

如何下载3GPP协议?

一、进入3GPP网页 https://www.3gpp.org/ 二、点击“Specifications &Technologies” 三、点击“FTP Server” 网址&#xff1a; https://www.3gpp.org/specifications-technologies 四、找到“latest”&#xff0c;查看最新版 网址&#xff1a; https://www.3gpp.org/ftp…

DeepFM模型预测高潜购买用户

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色&…

十一、Linux 之Linux 磁盘分区、挂载

1、linux分区 1.1 原理介 Linux 来说无论有几个分区&#xff0c;分给哪一目录使用&#xff0c;它归根结底就只有一个根目录&#xff0c;一个独立且唯一的文件结构 , Linux中每个分区都是用来组成整个文件系统的一部分。Linux 采用了一种叫“载入”的处理方法&#xff0c;它的整…

Ubuntu22.04环境下源码安装OpenCV 4.8.1

因为项目需要用OpenCV对yolov8模型进行推理&#xff0c;通过DNN模块&#xff0c;之前本地的OpenCV版本是4.5.4&#xff08;好像安装完ROS2 humble之后系统就自带了opencv&#xff09;&#xff0c;加载onnx模型一直报错&#xff0c;网上查询到需要4.7以上&#xff0c;干脆直接升…

sql 语句相关的函数

1. 聚合函数 这些函数用于对一组值进行计算&#xff0c;并返回单个值。 1.COUNT(): 计算行数。count SELECT COUNT(*) FROM students;2.SUM(): 求和。sum SELECT SUM(salary) FROM employees;3.AVG(): 计算平均值。avg SELECT AVG(score) FROM test_scores;4.MAX(): 找到最…

思维,CF 1980E - Permutation of Rows and Columns

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1980E - Permutation of Rows and Columns 二、解题报告 1、思路分析 我…

Golang | Leetcode Golang题解之第476题数字的补数

题目&#xff1a; 题解&#xff1a; func findComplement(num int) int {highBit : 0for i : 1; i < 30; i {if num < 1<<i {break}highBit i}mask : 1<<(highBit1) - 1return num ^ mask }

邻接矩阵的无向图(C语言代码)

无向图是对称的 所以 &#xff1a; G->matrix[i][j] 1; G->matrix[j][i] 1; AB线段为1的同时 BA的线段也为1 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #define MAXVEX 100//最大顶点数 typedef struc…

一键解锁新技能!2024年电脑录屏神器推荐

咱们现在这个时代&#xff0c;电脑录屏软件就跟手机一样&#xff0c;几乎人人都有。不管是教别人怎么做事&#xff0c;记录开会内容&#xff0c;还是把玩游戏时候的高光时刻分享给朋友&#xff0c;有个好用的录屏软件真的能让事情变得简单很多。今天我就来给你介绍四款2024年超…