当前位置: 首页 > news >正文

C语言数据结构:树的实现、前序、中序、后序遍历

一、什么是树

树是一种非线性的数据结构,由若干个节点组成。每个节点都包含数据,并且可以有多个子节点。树的最顶端是一个特殊的节点,叫根节点,它没有父节点。从根节点开始,树不断向下分叉,形成不同的层次。最底层的节点叫叶子节点,它们没有子节点。

二、树的种类

树有很多种类,每种都有自己的特点。

(一)二叉树

二叉树是最常见的树。它的每个节点最多有两个子节点,分别是左子节点和右子节点。二叉树的遍历方式有前序、中序和后序遍历,常用于表达式求值和数据排序。

(二)平衡二叉树

平衡二叉树是一种特殊的二叉树,它的左右子树高度差不超过1。这种树在插入、删除和查找数据时效率很高,常用于数据库索引。

(三)B树和B+树

B树和B+树是多路平衡查找树,主要用于数据库和文件系统的索引。它们可以高效地存储和检索大量数据。

树以其独特的结构和强大的功能,在数据存储和处理中发挥着重要作用,是计算机科学中不可或缺的一部分。

三、遍历

树的遍历是按照某种顺序访问树中的每个节点的过程,确保每个节点都被访问一次且仅一次。以下是常见的树的遍历形式,以二叉树为例:

前序遍历:适合构建树的结构、打印树的先序序列等。

中序遍历:适用于二叉搜索树的排序和查找。

后序遍历:适合删除树的节点、计算表达式的后缀形式等。

层次遍历:适合按层打印树的结构、计算树的深度等。

本次代码会实现前中后三种遍历:

前序遍历

过程:先访问根节点,然后递归地对左子树进行前序遍历,最后递归地对右子树进行前序遍历。简记为“根左右”。

中序遍历

过程:先递归地对左子树进行中序遍历,然后访问根节点,最后递归地对右子树进行中序遍历。简记为“左根右”。

后序遍历

过程:先递归地对左子树进行后序遍历,然后递归地对右子树进行后序遍历,最后访问根节点。简记为“左右根”。

//二叉搜索树
#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{
    int data;//数据域
    struct Node *left;//左子树
    struct Node *right;//右子树
}TreeNode;

TreeNode * insert(TreeNode * root,int val);
void pre_order(TreeNode *root);
void in_order(TreeNode *root);//中序遍历
void post_order(TreeNode *root);
int main(int argc, char const *argv[])
{
    //根节点指针
    TreeNode *root=NULL;
    //插入数据
    root = insert(root,1);
    root = insert(root,2);
    root = insert(root,3);
    root = insert(root,4);
    root = insert(root,5);
    in_order(root);
    pre_order(root);
    post_order(root);
    return 0;
}
TreeNode * insert(TreeNode * root,int val)
{
    if (root==NULL)//传入的结点为空时,创建新的结点
    {
        root=malloc(sizeof(TreeNode));
        root->data=val;
        root->left=NULL;
        root->right=NULL;
        return root;
    }
    if (val<root->data)
    {
        // 小于当前结点值,插入左子树
        root->left= insert(root->left,val);
    }
    else
    {
        //大于当前结点值,插入右子树
        root->right= insert(root->right,val);
    }
    return root;
}
void in_order(TreeNode *root)
{
    if (root==NULL)
    {
        return;
    }
    in_order(root->left);//先打印左子树
    printf("%d",root->data);//打印根节点
    in_order(root->right);//打印右子树
}
void pre_order(TreeNode *root)
{
    if (root==NULL)
    {
        return;
    }
    printf("%d",root->data);//打印根节点
    pre_order(root->left);//打印左子树
    pre_order(root->right);//打印右子树
}
void post_order(TreeNode *root)
{
    if (root==NULL)
    {
        return;
    }
    post_order(root->left);//打印左子树
    post_order(root->right);//打印右子树
    printf("%d",root->data);//打印根节点
}

相关文章:

  • 运用instanceof判断Animal a是否为Dog类和是否为cat类
  • PQ1-6弯曲疲劳试验机
  • Python创意:AI图像生成
  • [特殊字符] 第十四讲 | 空间异质性检验与地统计局部指标(LISA)应用
  • 《AI大模型应知应会100篇》第13篇:大模型评测标准:如何判断一个模型的优劣
  • KWDB创作者计划—KWDB场景化创新实践:多模态数据融合与边缘智能的突破性应用
  • opensuse安装需要手动添加仓库的软件包
  • TripoSG:高保真单张图像到3D生成模型——15亿参数的革新性突破
  • 学点概率论,打破认识误区
  • python可变对象与不可变对象
  • 探索 HTML5 新特性:提升网页开发的现代体验
  • 【模拟电路】开关二极管
  • 关于群晖安装tailscale后无法直链的问题
  • Skynet入门(二)
  • ABC-CNN-GRU-Attention、CNN-GRU-Attention、ABC-CNN-GRU和CNN-GRU四类对比模型多变量时序预测
  • 用纯Qt实现GB28181协议/实时视频/云台控制/预置位/录像回放和下载/事件订阅/语音对讲
  • 【LeetCode Solutions】LeetCode 160 ~ 165 题解
  • java基础 this和super的介绍
  • 教育舆情知识图谱构建与危机干预策略研究
  • C语言超详细指针知识(二)
  • 网站的链接结构包括/seo优化团队
  • 网站做浮动边框asp代码/360网站安全检测
  • 广西疫情最新消息今天/网站优化一年多少钱
  • 做百度网站一般多少钱/成都seo培训班
  • 做网站难度大吗/网络营销软件站
  • 网站建设wordpress/长沙免费建站网络营销