算法二叉树(一)

作者:纪念 229日期:2026/8/24

༺ 个人主页 · 纪念229 ༻

🏠我的博客主页🏠

༒专栏目录:《数据结构》༒

༒专栏目录:《算法》༒

༒专栏目录:《MySQL数据库》༒

༒专栏目录:《前端开发》༒

༒其它有趣的计算机知识༒

༺世上本没有路,走的人多了自然就有了༻


本节讲的是有关二叉树的OJ题,希望对你有所帮助
题目链接
二叉树前序遍历
二叉树中序遍历
二叉树的后序遍历
单值二叉树
对称二叉树


文章目录

  • 1.二叉树前序遍历
  • 2.单值二叉树
  • 3.对称二叉树

文章开始前我与大家讨论一个问题
算法题是不是做多了,然后每个题当场弄懂了,后面忘了,然后又弄懂,慢慢的算法能力就上来了?
大部分人学算法都是这个循环:听懂 → 过段时间忘光 → 重新看懂 → 慢慢内化,能力一点点涨

1.二叉树前序遍历

我们看到这题也许会觉得简单,确实它的思想就是二叉树前序排列
接下来我们来讨论一下这道题


我们可以看到它就给了这个
题目的意思是返回一个指针通过指针访问数组的元素
显然我们会创建一个指针作为数组的首地址
看到形参returnSize我们会先到啥
会不会是直接给出二叉树节点的个数(并不是)
首先我们看到int* 类型的所以判题的工具会根据这个形参的值来判断这题对不对
实际上是输出参数(指针)

这道题它的功能是
作为一个数组下标来访问目标数组让排序的好的数字一一放入数组中(恰巧)

这里讲个事,LeetCode题目里的形参都有它具体的意思
题做多了就认得了

代码展示

1/**
2 * Definition for a binary tree node.
3 * struct TreeNode {
4 *     int val;
5 *     struct TreeNode *left;
6 *     struct TreeNode *right;
7 * };
8 */
9/**
10 * Note: The returned array must be malloced, assume caller calls free().
11 */
12void dfs(struct TreeNode* node, int* result, int* returnSize){
13    if(node == NULL){
14        return;
15    }
16    result[(*returnSize)++] = node->val;
17    dfs(node->left, result, returnSize);
18    dfs(node->right, result, returnSize);
19}
20
21int* preorderTraversal(struct TreeNode* root, int* returnSize) {
22    int* result =(int*)malloc(sizeof(int) * 100);
23    *returnSize = 0;
24    dfs(root, result, returnSize);
25    return result;
26}
27

具体讲解:
有些刚做数据结构算法题的人认不得求:[x、d、1、t]啥的
它其实就是让你返回一个指针(指针里就有这个数组)
因为是数组要用到指针所以我们要用到malloc(没malloc该指针只能储存一个数据int*类型)

又因为我们要利用returnSize作为下标将二叉树的节点一一插入所以就解引用赋值为0

我们来看看dfs的形参是一个二叉树一个数组和一个下标就是根据前序排列将数据插图数组中

二叉树的题型一般都会考虑到当首节点为NULL时直接return不带任何东西

1    result[(*returnSize)++] = node->val;
2    dfs(node->left, result, returnSize);
3    dfs(node->right, result, returnSize);
4

这就是前序排序的方法ELR
我们看到如果头节点不为NULL的话
先二叉树的第一个节点数据放入数组中
dfs(node->left, result, returnSize);
然后利用递归用node->left将节点前移然后面临的又是dfs的重复操作
我们知道代码是从下往下读的所以
代码会先执行它dfs(node->left, result, returnSize);
再执行它dfs(node->right, result, returnSize);
就实现了将前序排序一个个放入数组中

这里讲一个优先级的事
(*returnSize)++若是没()就是给指针加加
*returnSize++先加加在解引用(若目的是将指针内的数据加加就要用括号将变量与解引用括起来)
++*returnSize

然后就是中序排序、后序排序代码差不多就是改一下顺序
中序排序LRE

1    dfs(node->left, result, returnSize);
2    result[(*returnSize)++] = node->val;
3    dfs(node->right, result, returnSize);
4

后序排序LRE

1    dfs(node->left, result, returnSize);
2    dfs(node->right, result, returnSize);
3    result[(*returnSize)++] = node->val;
4

解释一下为啥sizeof(int) * 100题目要求二叉树节点不超过100个怕给100个节点的二叉树所以乘了100

2.单值二叉树


代码展示

1/**
2 * Definition for a binary tree node.
3 * struct TreeNode {
4 *     int val;
5 *     struct TreeNode *left;
6 *     struct TreeNode *right;
7 * };
8 */
9bool isUnivalTree(struct TreeNode* root) {
10    if(root == NULL){
11        return true;
12    }
13    //判断二叉树头节点是否为NULL,为NULL说明为单值节点后续遍历完又可以说明符合单值规则
14    if(root->left && root->left->val != root->val){
15        return false;
16    }
17    if(root->right && root->right->val != root->val){
18        return false;
19    }
20    return isUnivalTree(root->left) && isUnivalTree(root->right);
21//一个一个遍历判断到最后节点为NULL返回ture因为有&&只要有一false就是false(非单值二叉树)
22
23}
24

就给了一个形参

要判断是单值二叉树就是看目标节点的左右节点是否等于头节点的数据
首先我们要知道头节点为NULL即为单值二叉树

然后判断目标节点的左右节点是否等于头节点的数据

最后用递归遍历左右两树杈是否符合单值二叉树的规则
此后的节点为NULL说明该树杈符合单值二叉树的规则

最后讲一下&&的作用(只有左右两边为真才为真其塔都返回假(若是第一个判为假第二个就不用判了直接为假))
我们利用递归函数和&&最终返回了bool值所以只要将有一个不符合规则就会报错
最后讲一下递归(要看递归其实就是从最后一步开始看虽然函数是一步一步问下走的没有返回值递归函数就不会消失(所以看递归思想看的就是最后一步return的然后就是上一个函数的返回值))

补充一下||
两个为真才为真
两个为假才为假
一假一真为真

3.对称二叉树



开始只有这个

代码展示

1/**
2 * Definition for a binary tree node.
3 * struct TreeNode {
4 *     int val;
5 *     struct TreeNode *left;
6 *     struct TreeNode *right;
7 * };
8 */
9 //判断两棵树是否为镜像
10 bool check(struct TreeNode* left, struct TreeNode* right){
11     if(left == NULL && right == NULL){
12        return true;
13    }
14    if(left == NULL || right == NULL){
15     return false;
16    }
17    if(left->val != right->val){
18        return false;
19    }
20  //左子树的左与右子树的右比较
21  //左子树的右与右子树的左比较
22  return check(left->left, right->right) && check(left->right, right->left);
23 }
24bool isSymmetric(struct TreeNode* root) {
25  if(root == NULL){
26    true;
27  }
28return  check(root->left,root->right) ;
29}
30

具体讲解:
头节点为NULL即为对称二叉树返回true

之后用一个check函数形参为左右节点指针

(left == NULL && right == NULL)
我就讲这一个其他的研究一也会懂的
有两种意思当只有一个节点时为对称二叉树返回true
当全对比完后说明符合规则返回ture

return check(left->left, right->right) && check(left->right, right->left);
还有一个这个就是
//左子树的左与右子树的右比较
//左子树的右与右子树的左比较
这样递归就可以符合对称二叉树的规则


文章到这就告一段落,希望对你有所帮助,感谢观看!


《算法二叉树(一)》 是转载文章,点击查看原文。


相关推荐


AI agent学习之一基础知识
风之清扬2026/8/11

AI agent学习之一基础知识 一、基础知识案例1:获取 GitHub 用户粉丝数案例2:YAML文件的读写案例3:Git操作(git clone、commit和push)1)git clone2)先将修改文件暂存3)提交4)推送5)转换分支(checkout) 案例4:文件操作Linux端:Windows端: 案例5:API auth验证带token和不带token区别 AI agent的使用已经成为一个趋势,尽早入行才是王道。面对海量资料,如何入门确实是一个


Vue项目创建与入口配置全攻略
En^_^Joy2026/8/2

文章目录 一、vue项目创建二、入口界面配置 一、vue项目创建 创建项目:npm create vue@latest 执行后输入项目名(VueDemo),包名称(VueDemo),是否使用typeScript语法 E:\CODE\vueDemo>npm create vue@latest // 执行的指令 Need to install the following packages: create-vue@3.22.4 Ok to proceed? (y


C++ async 异步学习
小侯不躺平.2026/7/25

创建异步任务、延迟任务。任务或操作可以独立于主线程运行,主线程无需等待任务完成便可执行其他的任务,当异步的任务完成的时候可以通过某种机制获取其结果(std::future) 1、异步任务--async 正常使用环境 future.get #include<iostream> #include<thread> #include<chrono> #include<future> int task(int number) { // 抛出异常 或 返回正常结果 std::cout<


Spark 源码 | SparkSubmitArguments 参数解析(三)
董可伦2026/7/17

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:https://www.captainai.net/dongkelun 前言 在第二篇文章 Spark 源码 | SparkSubmit 提交流程分析(二) 中,我们分析了 SparkSubmit 的提交流程,其中 doSubmit 方法会调用 parseArguments 解析命令行参数。本文详细介绍参数解析的过程。 版本 Spark 3.2.3 SparkSubmitArguments


LeetCode 459. 重复的子字符串
Best_Jerry2026/7/9

leetcode.cn/problems/re… programmercarl.com/0459.%E9%87… 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。   示例 1: 输入: s = "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。 示例 2: 输入: s = "aba" 输出: false 示例 3: 输入: s = "abcabcabcabc" 输出: true 解释: 可由子串 "abc" 重复四次构成。 (或子串 "abc


HDFS javaAPI-windows的IDEA中java文件在linux中的hadoop平台运行
chde2Wang2026/7/1

目录 运行前提 一、在IDEA的Maven项目中创建MkDirDemo类 (1)先确认目录结构(Maven 标准目录,必须按这个来) (2)hdfs java操作代码输入 (3)验证pom.xml文件中hadoop依赖是否和linux中hadoop版本一致 (4)确认 HDFS RPC 地址(关键) 二、Windows 本地配置 Hadoop 运行环境(必做,否则报 winutils 缺失) (1)下载 Windows 适配 hadoop 二进制包Hadoop3.x 下载对应


Obsidian - 使用 Share Note 分享笔记并自部署
LinXunFeng2026/6/22

欢迎关注微信公众号:FSA全栈行动 👋 一、前言 最近在整理 Obsidian 笔记时,经常会遇到一个小需求:想把某一篇笔记快速分享给别人,但又不想为了它单独搭建博客、导出 PDF 或复制到其它平台。 如果只是分享纯文本,复制粘贴当然可以。但 Obsidian 笔记里往往会有这些内容: 图片附件 代码块 Callout 提示块 标签、任务列表 Dataview 查询结果 当前主题样式和自定义 CSS 笔记之间的内部链接 这时候手动搬运就有点麻烦了,格式容易丢,图片也要重新处理。这里介绍一


RabbitMQ 从入门到精通:Spring Boot 实战三部曲(一)—— 基础核心与快速上手
绝知此事2026/6/14

RabbitMQ 从入门到精通:Spring Boot 实战三部曲(一)—— 基础核心与快速上手 专题导读:本系列共三篇,从基础到高级,带你系统掌握 RabbitMQ 在 Spring Boot 项目中的实战应用。 第一篇:基础核心与快速上手(本文)第二篇:进阶特性与可靠性保障第三篇:高级应用与性能优化 📖 前言 在当今的分布式系统中,消息队列已成为不可或缺的基础设施。RabbitMQ 作为最流行的消息中间件之一,以其可靠性、灵活性和易用性著称。 本文将从 RabbitMQ 的基础概念出


iOS、Android、Flutter 2026 流行框架对比
王若风2026/6/7

参考文章:iOS、Android、Flutter 流行框架对比(原始链接) 我把我 2 年前的一篇博客文章进行了一次“重写”,于是有了这篇。 原文的选题很实用,结构也很清晰:按布局、网络请求、图片加载三个维度,把 iOS、Android、Flutter 常见框架放在一起横向看。 帮助移动端开发洞察各端核心框架的流行趋势,提供洞察和选项参考。 但原文的数据,放到 2026 年 6 月再看,已经有点过期了。 比如 Jetpack Compose 已经不是“新趋势”,而是 Android 新项目的


数据采集卡技术全解:从硬件架构到行业应用
zlinear数据采集卡2026/5/31

目录 数据采集卡技术全解:从硬件架构到行业应用 一、数据采集卡基础概念与分类体系 1.1 核心概念:连接物理世界与数字世界的桥梁 1.2 数据采集卡的核心功能构成 1.3 与传统测量仪器的本质区别 1.4 多维度的分类体系 1.4.1 按核心性能(采样率)分类 1.4.2 按总线接口类型分类 1.4.3 按功能与应用分类 章节小结 二、硬件架构深度解析 2.1 整体架构视图:从信号入口到数据出口 2.2 模拟前端:信号的“守门人”与“化妆师” 2.3 数据转换核心:A

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读