初识树(c语言)

简介: 初识树(c语言)

序列文章

初识树(C语言):http://t.csdnimg.cn/eqFmT

二叉树的基本概念(C语言):http://t.csdnimg.cn/AkwTC

大小堆的实现(C语言):http://t.csdnimg.cn/yoXVC

看了就会的堆排序(C语言):http://t.csdnimg.cn/EWzgM

top K问题(借你五分钟):http://t.csdnimg.cn/1YLT8

堆的相关时间复杂度计算(C语言):http://t.csdnimg.cn/OSAr4

二叉树的前、中、后序遍历的实现:http://t.csdnimg.cn/xNHrs

计算二叉树结点个数、叶子结点个数的代码实现:http://t.csdnimg.cn/kiBpd

二叉树查找值为x的结点、树的高度、第k层结点个数的代码实现:http://t.csdnimg.cn/BcFEW

二叉树的创建、销毁、层序遍历、层序遍历进阶的代码实现: http://t.csdnimg.cn/Qlxu0

二叉树的OJ练习(一):http://t.csdnimg.cn/jhOWW

二叉树的OJ练习(二) :http://t.csdnimg.cn/sl7kl

<你想看的我这里都有😎 >

定义:树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合,当n=0时,称为空树。

任意一颗非空树都应满足:

  1. 有且只有一个根结点,即图中的A结点
  2. 当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每个集合本身又是一棵树,并且称为根的子树,每棵子树的根结点有且只有一个前驱,可以有0个或多个后继结点,因此,树是递归定义的。

树与非树

树形结构中,子树之间不能有交集,否则就不是树形结构

树的相关概念

结点的度一个结点含有的子树的个数称为该结点的度;如上图:A的度为6

叶/终端结点度为0的结点称为叶结点(下面没有)如上图:BCHI...等节点为叶结点

非终端/分支结点度不为0的结点(下面还有)如上图:DEFG...等节点为分支结点

双亲/父结点一个结点有子结点,则这个结点称为其子结点的父结点;如上图:AB的父结点

孩子/子结点一个节点含有的子树的根节点称为该节点的子节点;如上图:BA的孩子结点

兄弟结点具有相同父结点的节点互称为兄弟结点;如上图:BC是兄弟结点

树的度一棵树中,最大的节点的度称为树的度;如上图:树的度为6

结点的层次根为第1层,根的下一层为第2层,以此类推;

树的高/深度树中结点的最大层次;如上图:树的高度为4

堂兄弟结点同层除兄弟结点外,其它结点都是堂兄弟结点;如上图:HI互为堂兄弟结点

子孙以某节点为根的子树中任一节点都称为该节点的子孙;如上图:所有结点都是A的子孙

森林由m(m>0)棵互不相交的树的集合称为森林;

有/无序树:根据树中任意节点的子结点之间有无顺序关系,将树分为有序树和无序树

路径和路径长度:两个结点之间的边称为路径,两个结点之间边的总合称为路径长度

上述内容不建议背诵,根据后续练习常看常理解即可

树的存储表示

      在构建树的结构时, 除了要保存节点的值域外,还需要保存节点与节点之间的关系。实际应用中,存在多种树的表示方式,如双亲表示法、孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。其中 最常用且灵活性较高的是孩子兄弟表示法(也称为二叉树链表存储),我们这里就简单的了解一下它是如何表示树的:

大致代码

typedef int DataType;
//左孩子右兄弟表示法
struct TreeNode
{
    DataType val; //结点中的数据域
    struct TreeNode* leftChild; //第一个孩子结点
    struct TreeNode* rightBrother; //指向其下一个兄弟结点
};
//模拟查找树的根节点下的每一个孩子
void find()
{
    struct TreeNode* child = A->leftChild;
    while(child)
    {
        child = child ->rightBrother;
    }
}

详细代码

#include <stdio.h>
#include <stdlib.h>
// 定义树节点结构
typedef struct TreeNode {
    char data;
    struct TreeNode* first_child;   // 指向第一个孩子节点
    struct TreeNode* next_sibling;  // 指向下一个兄弟节点
} TreeNode;
// 创建树节点函数
TreeNode* createNode(char data) {
    TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
    newNode->data = data;
    newNode->first_child = NULL;
    newNode->next_sibling = NULL;
    return newNode;
}
int main() {
  // 创建树结构,以示例中的图为例:
  /*
         A
        / \
       B   C  
      / \   
     D   E 
  */
  TreeNode* root = createNode('A');
  root->first_child = createNode('B');
  root->first_child->next_sibling= createNode('C');
  root->first_child -> first_child= createNode('D');
  root -> first_child -> first_chil d- > next_sibli ng= creat eNod e( 'E' );
  return 0;
}

实际应用(Linux文件系统的目录树):

~over~

相关文章
|
存储 算法 C语言
【C语言数据结构(基础版)】第五站:树和二叉树(上)
【C语言数据结构(基础版)】第五站:树和二叉树
117 0
|
3月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
103 1
|
21天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
60 16
|
2月前
|
C语言
数据结构基础详解(C语言):图的基本概念_无向图_有向图_子图_生成树_生成森林_完全图
本文介绍了图的基本概念,包括图的定义、无向图与有向图、简单图与多重图等,并解释了顶点度、路径、连通性等相关术语。此外还讨论了子图、生成树、带权图及几种特殊形态的图,如完全图和树等。通过这些概念,读者可以更好地理解图论的基础知识。
121 8
|
2月前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
2月前
|
存储 机器学习/深度学习 C语言
数据结构基础详解(C语言): 树与二叉树的基本类型与存储结构详解
本文介绍了树和二叉树的基本概念及性质。树是由节点组成的层次结构,其中节点的度为其分支数量,树的度为树中最大节点度数。二叉树是一种特殊的树,其节点最多有两个子节点,具有多种性质,如叶子节点数与度为2的节点数之间的关系。此外,还介绍了二叉树的不同形态,包括满二叉树、完全二叉树、二叉排序树和平衡二叉树,并探讨了二叉树的顺序存储和链式存储结构。
|
2月前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
5月前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
46 1
|
6月前
|
算法 C语言 容器
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145(下)
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145
66 7
|
6月前
|
C语言 容器
从C语言到C++_27(AVL树)概念+插入接口实现(四种旋转)(上)
从C语言到C++_27(AVL树)概念+插入接口实现(四种旋转)
50 4