树的存储结构(数据结构学习笔记)


存储树既要存储结点的数据元素本身,又要存储结点之间的逻辑关系。
因此树的存储分为三种常用的存储方法:双亲存储结构孩子链存储结构孩子兄弟链存储结构

双亲存储结构

在每个结点中除了存储数据元素本身以外,还存储当前结点的双亲位置

如图所示:

在这里插入图片描述

双亲存储结构的类型声明:

typedef struct
{
    ElemType data;      //存放结点的值
    int parent;         //存放双亲结点的位置
}PTree[MaxSize];        //PTree为双亲存储结构类型

优缺点

  • 该存储方式用来求某个结点的双亲结点非常容易,但在求某个结点的孩子结点时需要遍历整个存储结构

孩子链存储结构

在每个结点中除了存储数据元素本身以外,还存储当前结点的孩子结点位置

如图所示:

在这里插入图片描述

孩子链存储结构的类型声明:

typedef struct  node
{
    ElemType data;                  //结点的值
    struct node *sons[MaxSons];     //指向孩子结点
}TSonNode                           //孩子链存储结构中的结点类型

优缺点

  • 该存储方式用来求某个结点的孩子结点时非常容易,但在求某个结点的双亲结点时比较费时,并且树的度较大时存在较多的空指针域

应用

以孩子链作为树的存储结构,设计一个求树t高度的递归算法。
递归算法模型分析:

  • if(t=NULL)        f(t)=0
  • 其他情况          f(t)=MAX(f§)+1

算法设计:

int TreeHeight1(TSonNode *t)
{
    TSonNode *p;
    int i,h,maxh=0;
    
    if(t==NULL)
        return 0;               //空树返回高度0
    
    for(i=0;i<MaxSons;i++){     //处理非空树
        p=t->sons[i];           //p指向t的第i+1个孩子结点
        if(p!=NULL){            //若存在第t+1个孩子结点
            h=TreeHeight1(p);   //递归处理第t+1个孩子结点的树高度
            if(maxh<h)          //求所有子树的最大高度
                maxh=h;
        }
    }
    return (maxh+1);            //返回maxh+1
}

孩子兄弟链存储结构

在每个结点中除了存储数据元素本身以外,还存储当前结点的孩子结点位置以及兄弟结点位置

如图所示:

在这里插入图片描述

孩子兄弟链存储结构的类型声明:

typedef struct tnode
{   
    ElemType data;          //结点的值
    struct tnode *hp;       //指向兄弟
    struct tnode *vp;       //指向孩子结点
}TSBNode;                   //孩子兄弟链存储结构中的结点类型

优缺点

  • 该存储方式通常用来存储二叉树,缺点和孩子链存储结构一样,求某个结点的孩子结点时非常容易,但在求某个结点的双亲结点时比较费时

应用

以孩子链作为树的存储结构,设计一个求树t高度的递归算法。
递归算法模型分析:

  • if(t=NULL)        f(t) = 0
  • 其他情况          f(t) = MAX(f§) + 1

算法设计:

int TreeHeight2(TSBNode *t)
{
    TSBNode *p;
    int h,maxh=0;
    
    if(t==NULL)
        return 0;               //空树返回高度0
    
    p=t->vp;                    //p指向第一个孩子结点
    while(p!=NULL){             //扫描t的所有子树
        h=TreeHeight2(p);       //递归求子树的高度
        if(maxh<h)              //求出所有子树中的最大高度
            maxh=h;
        p=p->hp;                //继续处理t的其他子树
    }
    return (maxh+1);            //返回maxh+1
}
  • 学习数据结构教程(第五版)——李春葆教授主编
  • 图片来源于MOOC,数据结构——武汉大学——李春葆教授
  • (如若侵权可联系QQ删除)
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、表)、形结构(如二叉树、堆、B)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储表的动态分配节点,和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、表)、形结构(如二叉树、堆、B)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储表的动态分配节点,和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、表)、形结构(如二叉树、堆、B)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储表的动态分配节点,和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
你好!关于学习数据结构的C语言笔记,我可以给你一些基本的指导和概念。数据结构是计算机科学中非常重要的一门课程,它涉及存储和组织数据的方法。C语言是一种常用的编程语言,很适合用于实现各种数据结构。 下面是一些数据结构的基本概念,你可以在学习笔记中包含它们: 1. 数组(Array):一种线性数据结构,可以存储相同类型的元素。在C语言中,数组是通过索引访问的。 2. 表(Linked List):也是一种线性数据结构,但不需要连续的内存空间。表由节点组成,每个节点包含数据和指向下一个节点的指针。 3. 栈(Stack):一种后进先出(LIFO)的数据结构,类似于装满物品的箱子。在C语言中,可以使用数组或表来实现栈。 4. 队列(Queue):一种先进先出(FIFO)的数据结构,类似于排队等候的队伍。同样可以使用数组或表来实现队列。 5. (Tree):一种非线性数据结构,由节点和边组成。每个节点可以有多个子节点。二叉树是一种特殊的结构,每个节点最多有两个子节点。 6. 图(Graph):另一种非线性数据结构,由节点和边组成。图可以用来表示各种实际问题,如社交网络和地图。 这只是数据结构中的一些基本概念,还有其他更高级的数据结构,如堆、哈希表和二叉搜索等。在学习笔记中,你可以介绍每个数据结构的定义、操作以及适合使用它们的场景。 希望这些信息对你有所帮助!如果你有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值