目录

一.求链式二叉树节点个数

二.求链式二叉树叶子节点个数

 三.求链式二叉树第k层节点个数

 四.求链式二叉树的深度/高度

 五.链式二叉树查找值为x的节点

 六.链式二叉树的销毁 

七. 测试函数

八. 总结:


前言:

在学习链式二叉树的常用操作之前 我们需要手动创建一个二叉树 在上文的学习中 我们已经学习过了 链式二叉树的创建 代码如下

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>// 二叉树节点结构定义
typedef char BTDataType;
typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
} BTNode;// 创建新节点
BTNode* BuyBTNode(BTDataType x) {BTNode* node = (BTNode*)malloc(sizeof(BTNode));if (node == NULL) {printf("malloc failed\n");exit(-1);}node->data = x;node->left = NULL;node->right = NULL;return node;
}// 构建示例二叉树(便于测试)
BTNode* CreateBinaryTree() {BTNode* nodeA = BuyBTNode('A');BTNode* nodeB = BuyBTNode('B');BTNode* nodeC = BuyBTNode('C');BTNode* nodeD = BuyBTNode('D');BTNode* nodeE = BuyBTNode('E');BTNode* nodeF = BuyBTNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->right = nodeE;nodeC->left = nodeF;return nodeA;
}

一.求链式二叉树节点个数

代码实现: 

// 一、求二叉树节点个数
int BinaryTreeSize(BTNode* root) {// 空树节点个数为0return root == NULL ? 0 : 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}
  • 功能:计算二叉树中所有节点的总数。
  • 实现思路:
    • 空树(root == NULL)返回 0;
    • 非空树则返回「1(当前节点)+ 左子树节点数 + 右子树节点数」;
    • 递归遍历整个树,累加所有节点。
  • 时间复杂度:O (n),需访问每个节点一次。

二.求链式二叉树叶子节点个数

代码实现:

// 二、求二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root) {// 空树叶子节点个数为0if (root == NULL) {return 0;}// 左右孩子都为空的节点是叶子节点if (root->left == NULL && root->right == NULL) {return 1;}// 递归计算左右子树的叶子节点总和return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}
  • 功能:统计二叉树中叶子节点(无左右子树的节点)的数量。
  • 实现思路:
    • 空树返回 0;
    • 若当前节点的左右指针均为NULL,则是叶子节点,返回 1;
    • 否则递归计算左子树和右子树的叶子节点之和。

 三.求链式二叉树第k层节点个数

代码实现: 

// 三、求二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k) {assert(k >= 1); // k必须是正整数// 空树或k小于1,返回0if (root == NULL) {return 0;}// 第1层只有根节点if (k == 1) {return 1;}// 第k层节点个数 = 左子树第k-1层节点数 + 右子树第k-1层节点数return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
}
  • 功能:计算二叉树中第 k 层(根节点为第 1 层)的节点总数。
  • 实现思路:
    • 边界检查:k < 1时断言报错,空树返回 0;
    • 递归降层:第 k 层节点数等价于左右子树第 k-1 层节点数之和;
    • 终止条件:k == 1时,当前节点即为第 1 层节点,返回 1。
  • 注意:若 k 大于树的深度,返回 0。

 四.求链式二叉树的深度/高度

 代码实现:

// 四、求二叉树的深度/高度
int BinaryTreeDepth(BTNode* root) {// 空树深度为0if (root == NULL) {return 0;}// 计算左右子树深度int leftDepth = BinaryTreeDepth(root->left);int rightDepth = BinaryTreeDepth(root->right);// 树的深度 = 左右子树最大深度 + 1(当前节点)return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}
  • 功能:计算二叉树的最大深度(从根节点到最远叶子节点的层数)。
  • 实现思路:
    • 空树深度为 0;
    • 递归计算左子树和右子树的深度;
    • 当前树的深度 = 左右子树中最大深度 + 1(当前节点所在层)。
  • 特点:体现了「分治思想」,将树的深度问题分解为子树的深度问题。

 五.链式二叉树查找值为x的节点

代码实现:

// 五、二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x) {// 空树返回NULLif (root == NULL) {return NULL;}// 找到目标节点,返回该节点指针if (root->data == x) {return root;}// 先在左子树查找BTNode* leftRet = BinaryTreeFind(root->left, x);if (leftRet != NULL) {return leftRet;}// 左子树没找到,再在右子树查找BTNode* rightRet = BinaryTreeFind(root->right, x);return rightRet;
}
  • 功能:在二叉树中查找值为 x 的节点,返回该节点的指针(若不存在返回NULL)。
  • 实现思路:
    • 空树返回NULL
    • 先检查当前节点是否为目标节点,是则返回;
    • 否则先递归查找左子树,找到则返回;
    • 左子树未找到时,递归查找右子树并返回结果。
  • 查找顺序:本质是「前序遍历查找」,先根节点,再左子树,最后右子树。

 六.链式二叉树的销毁 

代码实现:

// 六、二叉树的销毁
void BinaryTreeDestroy(BTNode** root) {// 空树直接返回if (*root == NULL) {return;}// 先销毁左子树BinaryTreeDestroy(&(*root)->left);// 再销毁右子树BinaryTreeDestroy(&(*root)->right);// 最后释放当前节点free(*root);*root = NULL; // 避免野指针
}
  • 功能:释放二叉树所有节点的内存,彻底销毁树结构。
  • 实现思路:
    • 采用「后序遍历」思路:先销毁左子树,再销毁右子树,最后释放当前节点;
    • 使用二级指针**root,确保销毁后根节点被置为NULL,避免野指针;
    • 递归释放所有节点,无内存泄漏。
  • 关键:必须先释放子树,再释放当前节点,否则会丢失子树指针导致内存泄漏。

七. 测试函数

//测试函数
int main() {BTNode* root = CreateBinaryTree();// 测试节点个数printf("二叉树节点总数: %d\n", BinaryTreeSize(root));// 测试叶子节点个数printf("二叉树叶子节点个数: %d\n", BinaryTreeLeafSize(root));// 测试第k层节点个数printf("第2层节点个数: %d\n", BinaryTreeLevelKSize(root, 2));printf("第3层节点个数: %d\n", BinaryTreeLevelKSize(root, 3));// 测试树的深度printf("二叉树深度: %d\n", BinaryTreeDepth(root));// 测试查找节点BTNode* findNode = BinaryTreeFind(root, 'E');if (findNode != NULL) {printf("找到节点: %c\n", findNode->data);}else {printf("未找到节点\n");}// 销毁二叉树BinaryTreeDestroy(&root);assert(root == NULL); // 验证树已被销毁return 0;
}

代码运行结果如下:

链式二叉树如下图 进行验证

根据上图 不难得出 代码运行 正确

八. 总结:

所有函数均采用递归实现,符合二叉树的递归特性(每个节点的左、右子树仍是二叉树)。核心思想是「分治」:将对整棵树的操作分解为对根节点和左右子树的操作,简化问题复杂度。每个函数的时间复杂度均为 O (n)(n 为节点总数),空间复杂度为 O (h)(h 为树的高度,递归栈的深度)。

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

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

相关文章

YOLO11目标检测运行推理简约GUI界面

YOLO11推理简约GUI界面使用方法&#xff1a;支持pt和onnx格式模型,并且自动检测设备&#xff0c;选择推理设备选择推理图片所在的文件夹 选择推理后的结果保存地址选择所需要的置信度阈值点击开始推理&#xff0c;程序自动运行 并在下方实时显示推理进度非常方便不用每次都改代…

集值优化问题:理论、应用与前沿进展

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1. &#x1f4da; 集值优化问题概述 集值优化问题主要研究目标函数为…

提示工程架构师分享:如何用提示词升级职业教育的实操案例教学?(万字长文来袭,高能预警!!!)

引言&#xff1a;实操案例教学的“困境”&#xff0c;终于有了破局思路&#xff1f; 晚上10点&#xff0c;汽修专业的王强老师还在电脑前修改《汽车发动机异响故障排查案例》——这已经是他本周第四次调整方案了&#xff1a; 第一次授课时&#xff0c;学生反馈“案例太理想化&a…

「日拱一码」087 机器学习——SPARROW

目录 SPARROW 介绍 核心思想&#xff1a;稀疏掩码训练 与 Lottery Ticket Hypothesis (LTH) 的关系 代码示例 代码关键点解释&#xff1a; 在机器学习领域&#xff0c;"SPARROW" 并不是一个像 Scikit-learn、TensorFlow 或 PyTorch 那样广为人知的通用框架或算法…

18、决策树与集成学习 - 从单一智慧到群体决策

学习目标:理解决策树的构建原理和分裂标准,掌握信息增益、基尼系数等概念,学会决策树的剪枝方法,深入理解集成学习的思想,掌握随机森林和梯度提升的基本原理。 > 从第17章到第18章:从概率模型到规则模型 在第17章中,我们学习了逻辑回归——一个基于概率的线性分类器…

王道计算机组成原理 学习笔记

第一章计算机系统概述1.1计算机的发展历程1.2计算机系统层次结构1.2.11.2.2 计算机硬件的基本组成1.2.2 各个硬件的工作原理1.2.3 计算机软件1.2.4 计算机系统的层次结1.2.5 计算机系统的工作原理1.3计算机的性能指标第二章数据的表示和运算第三章存储系统第四章指令系统第五章…

Oracle 笔记1 表空间及用户

Oracle 笔记1 表空间及用户1 安装Oracle2 创建表空间3 创建表空间用户1. 核心管理用户2. 示例与工具用户3. 系统与服务用户4. 创建表空间用户5. 修改表空间用户特性OracleMySQL开发商Oracle 公司最初由 MySQL AB 开发&#xff0c;后被 Sun 收购&#xff0c;现属 Oracle 公司数据…

MyBatis主键返回机制解析

关于 MyBatis 主键返回的深入解释 核心问题&#xff1a;信息隔离 数据库和应用程序是两个独立的系统&#xff1a; 数据库在服务器上执行 INSERT 操作并生成主键应用程序在另一个进程或甚至另一台机器上运行如果没有明确的机制&#xff0c;应用程序无法自动知道数据库生成了什么…

【Python】Python内置函数大全解析(附源码)

目录专栏导读前言&#x1f680; 功能特性1. 全面的函数覆盖2. 多种查询工具3. 完整的测试验证&#x1f6e0;️ 使用方法基本使用交互式查询运行测试&#x1f4da; 支持的内置函数分类数学运算 (13个)类型转换 (8个)序列操作 (8个)迭代器 (6个)输入输出 (3个)对象操作 (31个)&am…

每日算法题推送

题目1&#xff1a;快乐数 我们先来结合实例看一下判断快乐数的整个过程&#xff1a; 结合题目可以知道&#xff0c;如果一个数是快乐数&#xff0c;那么这个数最终就会变成1&#xff0c;如果一个数不是快乐数&#xff0c;那么变化序列最终就会陷入循环。想一下&#xff0c;如果…

Oracle体系结构-数据文件(Data Files)

一、 数据文件的本质与原理 物理存储的基石&#xff1a; 数据文件是 Oracle 数据库在操作系统层面最核心、最基础的物理存储单元。它们是存储在服务器硬盘&#xff08;或存储阵列&#xff09;上的操作系统文件&#xff08;如 .dbf, .ora 扩展名常见&#xff0c;但非强制&#x…

【C++练习】18.C++求两个整数的最小公倍数(LCM)

目录C求两个整数的最小公倍数(LCM)的方法方法一&#xff1a;利用最大公约数(GCD)计算代码实现方法二&#xff1a;逐次增加法代码实现方法三&#xff1a;质因数分解法代码实现方法比较处理大数和特殊情况改进版GCD方法实现 C求两个整数的最小公倍数(LCM)的方法 最小公倍数(LCM)是…

Linux网络:应用层协议http

前言 虽然我们说&#xff0c;应用层协议是我们程序猿自己定的。但实际上,已经有大佬们定义了一些现成的,又非常好用的应用层协议,供我们直接参考使用.HTTP(超文本传输协议)就是其中之一。 我们之前已经学了UDP与TCP套接字的简单使用&#xff0c;以及讲解了进程间的各种关系&a…

ffmpeg推流测试

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、操作步骤1.测试12.测试2总结前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 环境信息&#xff1a; 摄像头&#xff1a;usb摄像头 &a…

Docker的使用及核心命令

文章目录Docker基础概念镜像管理命令镜像查看和搜索镜像下载和删除镜像构建容器生命周期管理创建和启动容器容器控制命令容器清理容器交互和调试进入容器文件操作日志和监控数据管理数据卷&#xff08;Volume&#xff09;绑定挂载网络管理网络基础操作端口映射Dockerfile和Dock…

考研408计算机网络第36题真题解析(2021-2023)

&#xff08;2023.36&#xff09;在使用 CSMA/CD 协议的环境中&#xff0c;使用截断二进制指数退避算法&#xff0c;来选择重传时机&#xff0c;算法 有如下规定&#xff1a; &#xff08;1&#xff09;基本的退避时间为争用期 2τ&#xff0c;假设某网络具体的争用期为 51.2us…

Asio C++ Library是用来做什么的

hriskohlhoff/asio 是由 Chris Kohlhoff 主导维护的开源 C 库&#xff0c;专注于提供高效、跨平台的异步 I/O 支持&#xff0c;广泛应用于网络编程、并发控制和高性能系统开发。 &#x1f4d8; 项目概述 项目名称&#xff1a;Asio C Library 下载地址&#xff1a;https://down…

ac791的按键ad_channel

每次ad_channel这个参数都要给我一定的迷惑性&#xff0c;让我以为这是通道的数量

机器人巡检与巡逻的区别进行详细讲解和对比

机器人巡检与巡逻的区别进行详细讲解和对比 尽管这两个词经常被混用&#xff0c;但在技术和应用层面上&#xff0c;它们有着本质的区别。核心区别在于&#xff1a;巡检是“深度体检”&#xff0c;而巡逻是“治安巡查”。 以下将从多个维度进行详细讲解和对比。 一、核心概念与目…

先进电机拓扑及控制算法介绍(3)——以“数据”驱动电机实现真正的无模型

1. 背景介绍 之前已经介绍过“无模型预测控制&#xff08;Model-Free Predictive Control/MFPC&#xff09;”中的“无模型预测电流控制&#xff08;Model-Free Predictive Current Control/MFPCC&#xff09;”&#xff0c;可参考下面知乎。 https://zhuanlan.zhihu.com/p/6…