【数据结构】【王道】【树与二叉树】二叉树的实现及基本操作(可直接运行)

【2025王道数据结构】王道数据结构课后代码题汇总答案C、C++代码实现完整版大全(可直接运行) 下面内容是本人在复习王道数据结构的过程中, 对一些算法设计题目的全部实现(答案解析全部都是伪码或者函数的部分实现,不可调试运行),不一定是最优的, 但是都能保证端到端测试运行,本文会陆陆续续更新,个人水平有限,可能文章里面存在一些问题,还望各位多多指点。   加油,阿光!!!我看好你哦😋😋😋 以下摘自王道2023年数据结构考研复习指导题目 文章目录 😉第2章:线性表 ✌18页综合应用题 题号 题解链接 1 传送门 2 传送门 3 传送门 4 传送门 5 传送. 阅读详情

总目录


各部分的解释已经以注释形式写于代码中。

1.基本操作

1.1 结构体构造

typedef struct BiTNode {
    // 数据域
    char data;
    // 左、右孩子指针
    struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

1.2 初始化

// 初始化
void InitTree(BiTree &T) {
    // 初始化可将根节点置空,空树
    T = NULL;
    // 插入根节点
    // 分配空间
    T = (BiTree)malloc(sizeof(BiTree));
    // 赋值
    T->data = 'A';
    // 初始无左右子树
    T->lchild = NULL;
    T->rchild = NULL;
}

1.3 左插入结点

// 左插入结点
bool InsertLeftTreeNode(BiTNode* &T, char x) {
    // 分配空间
    BiTNode *p = (BiTNode*)malloc(sizeof(BiTNode));
    // 分配空间失败的情况
    if(p == NULL) {
        return false;
    }
    // 数据域赋值
    p->data = x;
    // 初始插入,无左右孩子,置空
    p->lchild = NULL;
    p->rchild = NULL;
    // 作为指定插入结点的左孩子
    T->lchild = p;
    return true;
}

1.4 右插入节点

// 右插入结点
bool InsertRightTreeNode(BiTNode* &T, char x) {
    // 分配空间
    BiTNode *p = (BiTNode*)malloc(sizeof(BiTNode));
    // 分配空间失败的情况
    if(p == NULL) {
        return false;
    }
    // 数据域赋值
    p->data = x;
    // 初始插入,无左右孩子,置空
    p->lchild = NULL;
    p->rchild = NULL;
    // 作为指定插入结点的左孩子
    T->rchild = p;
    return true;
}

1.5 访问结点

// 访问结点
void visit(BiTree T) {
    printf("%c   ", T->data);
}

1.6 先序遍历(递归)

// 先序遍历
// 即根左右,先访问根结点,再依次访问左右结点
void PreOrder(BiTree T) {
    // 根节点为空则直接跳过
    if(T != NULL) {
        // 访问根结点
        visit(T);
        // 递归访问左子树
        PreOrder(T->lchild);
        // 地柜访问右子树
        PreOrder(T->rchild);
    }
}

1.7 中序遍历(递归)

// 中序遍历
// 即左根右,先访问左结点,再访问根结点,最后访问右结点
void InOrder(BiTree T) {
    if(T != NULL) {
        // 递归遍历左子树
        InOrder(T->lchild);
        // 访问根结点
        visit(T);
        // 递归遍历右子树
        InOrder(T->rchild);
    }
}

1.8 后序遍历(递归)

// 后序遍历
// 即左右根,先依次访问左右结点,最后访问根结点
void PostOrder(BiTree T) {
    if(T != NULL) {
        // 递归遍历左子树
        PostOrder(T->lchild);
        // 递归遍历右子树
        PostOrder(T->rchild);
        // 访问根结点
        visit(T);
    }
}

1.9 树的深度

// 树的深度
int treeDepth(BiTree T) {
    // 根结点为空,则深度为0
    if(T == NULL) {
        return 0;
    } else {
        // 递归遍历左子树,获得左子树深度
        int l = treeDepth(T->lchild);
        // 递归遍历右子树,获得右子树深度
        int r = treeDepth(T->rchild);
        // 树的深度=Max{左子树深度,右子树深度} + 1
        // 加1相当于访问根节点,包括根结点深度+1
        return l > r ? l + 1 : r + 1;
    }
}

2.完整代码

#include<stdio.h>
#include<stdlib.h>

typedef struct BiTNode {
    // 数据域
    char data;
    // 左、右孩子指针
    struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

// 初始化
void InitTree(BiTree &T) {
    // 初始化可将根节点置空,空树
    T = NULL;
    // 插入根节点
    // 分配空间
    T = (BiTree)malloc(sizeof(BiTree));
    // 赋值
    T->data = 'A';
    // 初始无左右子树
    T->lchild = NULL;
    T->rchild = NULL;
}

// 左插入结点
bool InsertLeftTreeNode(BiTNode* &T, char x) {
    // 分配空间
    BiTNode *p = (BiTNode*)malloc(sizeof(BiTNode));
    // 分配空间失败的情况
    if(p == NULL) {
        return false;
    }
    // 数据域赋值
    p->data = x;
    // 初始插入,无左右孩子,置空
    p->lchild = NULL;
    p->rchild = NULL;
    // 作为指定插入结点的左孩子
    T->lchild = p;
    return true;
}

// 右插入结点
bool InsertRightTreeNode(BiTNode* &T, char x) {
    // 分配空间
    BiTNode *p = (BiTNode*)malloc(sizeof(BiTNode));
    // 分配空间失败的情况
    if(p == NULL) {
        return false;
    }
    // 数据域赋值
    p->data = x;
    // 初始插入,无左右孩子,置空
    p->lchild = NULL;
    p->rchild = NULL;
    // 作为指定插入结点的左孩子
    T->rchild = p;
    return true;
}

// 访问结点
void visit(BiTree T) {
    printf("%c   ", T->data);
}

// 先序遍历
// 即根左右,先访问根结点,再依次访问左右结点
void PreOrder(BiTree T) {
    // 根节点为空则直接跳过
    if(T != NULL) {
        // 访问根结点
        visit(T);
        // 递归访问左子树
        PreOrder(T->lchild);
        // 地柜访问右子树
        PreOrder(T->rchild);
    }
}

// 中序遍历
// 即左根右,先访问左结点,再访问根结点,最后访问右结点
void InOrder(BiTree T) {
    if(T != NULL) {
        // 递归遍历左子树
        InOrder(T->lchild);
        // 访问根结点
        visit(T);
        // 递归遍历右子树
        InOrder(T->rchild);
    }
}

// 后序遍历
// 即左右根,先依次访问左右结点,最后访问根结点
void PostOrder(BiTree T) {
    if(T != NULL) {
        // 递归遍历左子树
        PostOrder(T->lchild);
        // 递归遍历右子树
        PostOrder(T->rchild);
        // 访问根结点
        visit(T);
    }
}

// 树的深度
int treeDepth(BiTree T) {
    // 根结点为空,则深度为0
    if(T == NULL) {
        return 0;
    } else {
        // 递归遍历左子树,获得左子树深度
        int l = treeDepth(T->lchild);
        // 递归遍历右子树,获得右子树深度
        int r = treeDepth(T->rchild);
        // 树的深度=Max{左子树深度,右子树深度} + 1
        // 加1相当于访问根节点,包括根结点深度+1
        return l > r ? l + 1 : r + 1;
    }
}


int main() {
    BiTree T;
    InitTree(T);
    InsertLeftTreeNode(T, 'B');
    InsertRightTreeNode(T, 'C');
    InsertLeftTreeNode(T->lchild, 'D');
    InsertRightTreeNode(T->lchild, 'E');
    InsertLeftTreeNode(T->rchild, 'F');
    InsertRightTreeNode(T->rchild, 'G');
    printf("PreOrder\n");
    PreOrder(T);
    printf("\nInOrder\n");
    InOrder(T);
    printf("\nPostOrder\n");
    PostOrder(T);
    printf("\ntreeDepth:%d\n", treeDepth(T));
}

3.运行结果

在这里插入图片描述

【专栏必读】王道考研408数据结构+算法设计与分析万字笔记使用说明及章节导航 各位老铁思维导图在我整理完笔记后会放上去的,我需要根据王道的思维导图重新再做一遍 文章目录一:有关注意事项二:关于专栏三:学习建议四:各专栏导航(各位老铁别催,质量优先)(1)第一章:绪论(2)第二章:线性表(3)第三章:栈和队列第四章:串第五章:二叉树第六章:图 首先感谢王道大大(手动比心),很用心在做了,大家可以看其中两节是否符合胃口 (王道408考研数据结构)第五章树-第三节1:二叉树遍历(先序、中序和后序) (王道408考研数据结构)第五章树-第四节2:平衡二叉树(AVL)及其旋转 一:有. 阅读详情

相关推荐

数据结构——十九、树,森林与二叉树之间的转换(王道408)

本文介绍了树、森林与二叉树之间的相互转换方法。重点讲解了孩子兄弟表示法的处理技巧:树转二叉树时,将孩子结点用右指针串联成"糖葫芦"结构;森林转二叉树需将各树根节点视为平级兄弟;恢复时则逆向操作,拆解右指针链。每种转换都配有具体示例和图示说明,最后总结了转换技巧和重要考点。文章采用逐步分解的方式,使复杂的结构转换过程变得清晰易懂,适合学习树形结构转换的读者参考。

2301_80201235的博客 1309

二叉树实例学习(三)——插入左右节点函数测试

在节点类BinNode中添加插入节点函数 ///***********插入孩子节点******************************* /// 将数据e作为当前节点的左孩子或右孩子插入,并返回该节点指针 BinNodePosi(T) insertAsLC(T const&e) { return lc=new BinNode(e,this)...

weixin_30549657的博客 212

ROS牛耕法全覆盖规划:从算法原理到清洁机器人实战解析

本文深入解析ROS牛耕法全覆盖规划算法在清洁机器人中的应用,从算法原理到实战优化技巧全面覆盖。详细介绍了地图预处理、区域分解和路径优化等关键步骤,并分享实际案例中的解决方案,帮助开发者提升机器人清扫效率和覆盖率。

weixin_27013291的博客 392

【leetcode 二叉树 双递归】面试题 04.12. Paths with Sum LCCI

面试题 04.12. Paths with Sum LCCI /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public:

izhxxx的博客 185

Gephi实战指南——从数据导入到可视化输出

本文详细介绍了Gephi数据可视化工具的使用方法,从数据导入到可视化输出的全流程实战指南。涵盖Gephi三大工作区功能、数据导入技巧、图形编辑进阶操作以及专业级可视化输出方案,帮助用户高效完成社交网络分析等复杂任务。

weixin_28731223的博客 481

Rocfall安装包&安装教程

Rocfall 第一步:下载安装包 下载路径: 链接:https://pan.baidu.com/s/1Dzvxzv67dSPRi7f7ZT9EeA 提取码:o9pl 第二部:安装 安装包解压 选择part1进行解压 点击Setup.exe启动安装 生成Serial Number 替换启动程序 安装完毕 素材来源于网络(禁止用于商业仅用于完成毕业设计和研究使用) 谢谢! ...

cym的博客 8702

王道数据结构【二叉树】部分代码实现(C语言)

王道数据结构【二叉树】部分代码实现(C语言)

年少的勇气已经用完,剩下的就是三思而后行 2308

Kriging克里金模型实现数据回归预测Matlab代码

Kriging克里金模型实现数据回归预测Matlab代码

天天酷科研的博客 604

2020考研-王道数据结构-树和二叉树-树与二叉树的应用

说在开头 下面给出的是函数,具体的可执行程序,会在这一系列的所有博客完结后上传到优快云。 函数也是可执行的程序,对于这一章的建树的程序没有贴上,是因为和前面的博客【二叉树的遍历】中的建树程序是一样的,需要的话,大家可以自行去参考。 头文件定义 #include <iostream> #include <algorithm> #include <string&gt...

qq_40285036的博客 1451

从零开始:手把手教你设计人形机器人锂电池供电系统

人形机器人要像人类一样“活起来”,必须有稳定的“能量血液”——供电系统。本文聚焦锂电池供电系统如何根据机器人功耗选择合适的锂电池参数(容量、电压、放电倍率);如何设计电池管理系统(BMS)保护电池安全;如何解决机器人运动时的“瞬时大电流”供电难题;如何通过硬件电路和代码实现供电系统的监测与控制。用“机器人小助手的能量危机”故事引入锂电池供电系统;拆解锂电池核心参数(容量、电压、放电倍率)和供电系统三大组件(电池组、BMS、电源转换模块);

AI天才研究院 1759

EMB电子机械制动系统和EHB电子液压制动系统控制功能的对比

EMB电子机械制动系统相比EHB液压制动系统具有显著优势:响应速度更快(<100ms)、控制精度更高(±2N·m)、能实现单轮独立控制,支持0.1%级制动力调节。在ABS、ESC等安全功能上表现更优,制动平顺性和NVH性能更好,同时提升能量回收效率15%-20%。特别适合智能驾驶需求,可使AEB等系统响应时间缩短50ms,紧急制动距离减少1米以上。EMB系统完美契合高阶自动驾驶对快速响应和精准控制的要求。

m0_59012156的博客 885

11. 王道考研-二叉树的实现

文章目录一、二叉树的顺序存储二、二叉树的链式存储三、二叉树的遍历3.1递归算法3.2 非递归算法3.3 层次遍历3.4 由遍历序列构造二叉树3.5 线索二叉树 一、二叉树的顺序存储 完全二叉树: 非完全二叉树(先要补成完全二叉树) 二、二叉树的链式存储 typedef char ElemType; typedef struct node { ElemType data; struct node *lchild; struct node *r

衍射的博客 737

Coze智能体开发:搭建一个解析 PDF 文件的工作流

大模型本身并不具备文件读取和解析的能力,无法直接处理文件字节流。对于支持工具调用(Function calling)的模型,扣子提供插件功能来帮助大模型调用外部工具 API,拓展大模型的能力边界。扣子插件商店提供海量官方插件和第三方插件,例如链接读取插件可以将链接对应的文件内容解析为纯文本传递给大模型。

王国平的博客 2813

【数据结构】【王道】【树与二叉树】中序二叉线索树的实现及基本操作(可直接运行)

在含有n个结点的二叉树中,有n+1个空指针,即每个度为1的结点有一个空指针,每个叶子结点有两个空指针,这就造成了空间的浪费。可以通过一些方法将这些空指针充分利用起来,即将这些空指针改成指向前驱或后继的线索,可以视为在原本的二叉树上用空指针建立一个线索链表,加上了线索的二叉树也可称为线索二叉树。要找到一个结点的后继,如果右孩子指针tag==1,直接用线索即可,如若不为1,那么就要根据中序遍历的特点来寻找后继结点,即左根右。如果该结点有右孩子且右孩子为叶子结点,那么这就是其后继结点,如果该节点有右孩子,且为分支

treesorshining的博客 938

【2026OD新机考】【不定滑窗】20260415-API请求日志去重分析【Py/Java/C++/C/JS/Go六种语言OD真题】【欧弟算法】全网注释最详细分类最全的华子OD真题题解

中找到所有的连续的相同元素,同时统计对应的连续相同元素对应的值的平均值。:当右指针为第一个元素(没有前一个元素),或者右指针对应的元素。某微服务系统的日志监控平台需分析API调用记录,日志含大量。相等,说明当前元素仍然属于同一个相同元素窗口,将当前元素值。中的所有元素均相等,并且计算窗口和情况即可。请实现一个函数,对给定的日志数据去重合并处理。位置,表示开启一个新的窗口,此时需要重置窗口和。,为了优化重复的请求记录,存储和后续分析需对。:对应的响应时间数组(毫秒)。重新置为当前右指针的元素值。

weixin_48157259的博客 112

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

24王道考研408数据结构代码整合(学习用)

define MaxSize 10 //定义最大长度//用静态的“数组”存放数据元素int length;//顺序表的当前长度}SeqList;//顺序表的类型定义(静态分配方式)//基本操作——初始化一个顺序表i

Ch_ensf的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

王道考研数据结构代码总结

目录 不带头结点的单链表 带头结点的单链表 不带头结点的单链表 #include<iostream> #include<algorithm> using namespace std; typedef struct LNode { int data; struct LNode* next; }LNode, * LinkList; //struct LNode* == LinkList //强调节点 用LNode //强调链表 用LinkList //初始化单链

兜率工的博客 3万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【王道考研】王道数据结构与算法详细笔记(全)

线性表是具有相同数据类型的n(n>0)个数据元素的有限序列。(其中n为表长,当n=0时线性表是一个空表。若用L命名线性表,则其一般表示为)1. 存在惟一的第一个元素。2. 存在惟一的最后一个元素。3. 除第一个元素之外,每个元素均只有一个直接前驱。4. 除最后一个元素之外,每个元素均只有一个直接后继1.是线性表中的“第i个”元素线性表中的位序。2.是表头元素;是表尾元素。

强哥的微博 7万+

王道2023数据结构笔记

线性表的定义​线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。若用L命名线性表,则其一般表示为L=(a1,a2,…,ai,ai+1,…,an)​ai是线性表中的“第i个”元素线性表中的位序​a1是表头元素;an是表尾元素​除第一个元素外,每个元素有且仅有一个直接前驱;除最后一个元素外,每个元素有且仅有一个直接后继线性表的基本操作初始化表。构造一个空的线性表L,分配内存空间。销毁操作。插入操作。删除操作。...

一顿吃不饱的博客 2万+

数据结构学习笔记(王道)

数据结构学习笔记(王道) PS:本文章部分内容参考自王道考研数据结构笔记 文章目录数据结构学习笔记(王道)一、绪论1.1. 数据结构1.2. 算法1.2.1. 算法的基本概念1.2.2. 算法的时间复杂度1.2.3. 算法的空间复杂度二、线性表2.1. 线性表的定义和操作2.1.1. 线性表的基本概念2.1.2. 线性表的基本操作2.2. 顺序表2.2.1. 顺序表的基本概念2.2.2. 顺序表的实现2.2.3. 顺序表的基本操作2.3. 链表2.3.1. 单链表的基本概念2.3.2. 单链表的实现2.3.

qq_55593227的博客 4万+

《王道》数据结构笔记整理2022

数据结构第一章绪论1.1数据结构的基本概念1.2数据结构的三要素1.3算法的基本概念1.4算法的时间复杂度1.5算法的空间复杂度 第一章绪论 1.1数据结构的基本概念 1.数据:数据是信息的载体,是描述客观事物属性的数、字符以及所有能输入到计算机中并被程序识别和处理的符号的集合。 2.数据元素:数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。例如,学生记录就是一个数据元素,它由学号、姓名、性别等数据项组成。 3.数据对象:数

池鱼 27万+

王道考研2021——数据结构学习笔记

王道给的代码中,有些用的是c++语言,但是和c的区别不大,不影响理解。 线性表 链表 单链表的定义 目前,只记了带头结点的情况 初始化单链表: typedef struct LNode{ //定义单链表结点类型 ElemType data; //每个结点存放一个数据元素 struct LNode *next; //指针指向下一个结点 }LNode,*LinkList; //初始化一个单链表 bool InitList(LinkList &L){ //&表示间接访问,和c语言使.

DanmoSAMA的博客~ 8210

【数据结构】【王道】【数据结构实现】文章目录

数据结构实现文章目录

treesorshining的博客 1915

王道数据结构 | 第五章 树与二叉树

王道数据结构 | 第五章 树与二叉树 代码和计算都很重要

emmm_Yeah的博客 1198

2019王道《数据结构》——树和二叉树

1.树的存储结构有多种,既可以采用顺序存储结构,也可以采用链式存储结构,都要求能唯一地反映出树中各结点之间的逻辑关系,三种常用的存储结构   1)双亲表示法   采用一组连续空间来存储每个结点,同时在每个结点中增设一个伪指针,指示其双亲节点在数组中的位置,根节点下标为0,其伪指针域为-1。 #define MAX_TREE_SIZE 100 //树中最多结点数 typedef stru...

69小石头的博客 2202

【2026考研】《王道数据结构与算法》笔记汇总(超详细合集)

本篇文章是在准备 2026 年考研时,对《王道计算机考研 数据结构》的所有笔记进行汇总,方便学习和复习时查看。对于期末考试也可以食用。笔记是纯人工手打的,会有一些小问题,如果有错误的地方请评论或私信…

iFulling的博客 5580
上一篇: Web前端入门(十五)CSS背景
下一篇: 【数据结构】【王道】【树与二叉树】二叉树层序遍历实现(可直接运行)
Silver  Star
Silver Star 新星创作者: 大数据技术领域 新星创作者: 大数据技术领域
博客等级 码龄7年 1万+粉丝 72原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silver Star

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值