树与二叉树之一--基本概念与存储结构

  • 树的基本术语

    1. 结点: 结点不仅包含数据元素,而且包含指向子树的分支。
    2. 结点的度: 结点拥有的子树的个数或者分支的个数。
    3. 树的度: 树中各结点度的最大值。
    4. 叶子结点: 又叫终端结点,指度为0的结点。
    5. 非终端结点: 又叫分支结点,指度不为0的点。
    6. 子结点: 指结点的子树的根。
    7. 双亲结点: 与孩子结点的定义对应。
    8. 兄弟结点: 同一个双亲的孩子结点之间互为兄弟结点。
    9. 祖先、子孙: 从根到某结点的路径上的结点都是它的祖先,而以某结点为根的子树中的所有节点都是它的子孙
    10. 树的高度(深度): 树中结点的最大层次
    11. 结点的深度和高度: 结点的深度从根节点算起,根节点的深度为1;而结点的高度是从最底层的叶子结点算起的,叶子结点高度为1.
    12. 有序树: 树中结点的子树从左到右是有次序的,不能交换的,这样的树叫做有序树。
    13. 无序树: 树中结点的子树是无序的,可以任意交换。
    14. 丰满树:理想平衡树,要求除最底层外其他层都是满的。
    15. 森林: 若干棵不相交的树的集合。

     好了,概念说完了,接下来就是树这种数据结构是在内存中怎么存储的。存储结构无非两种:顺序存储,比如用数组实现的顺序表;链式存储,如链表。

     说到这插一个题外话,也是刚刚查资料的时候意识到的一个问题,什么是数据结构?

     百度百科上有这么一句话:数据结构具体指同一类数据元素中,各元素之间的相互关系,包括三个组成成分,数据的逻辑结构,数据的存储结构和数据运算结构。

     也就是说数据结构包括了同一类数据之间的逻辑关系、物理存储以及运算结构。而我们讨论的线性表(包括顺序表、链表)、树、图等数据结构指的是数据之间的逻辑结构:一个元素只有一个前驱和一个后继(线性表),一个元素只一个前驱但可以有多个后继(树),一个元素可以有多个前驱多个后继(图)。而这些逻辑关系在计算机中的物理存储方式就是其物理结构了。

    下边是借来的对顺序表、线性表和数组的区别的总结:

    1) 数组就是相同数据类型的元素按一定顺序排列的集合。

    一句话:就是物理上存储在一组联系的地址上。也称为数据结构中的物理结构。

    2)线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。

    一句话:线性表是数据结构中的逻辑结构。可以存储在数组上,也可以存储在链表上。

    3)线性表的结点按逻辑次序依次存放在一组地址连续的存储单元里的方法。用顺序存储方法存储的线性表简称为顺序表。

    一句话:用数组来存储的线性表就是顺序表。

    总结:你被这几个概念混淆,是因为你没搞懂数据结构里的逻辑结构和物理存储结构。

    回到正题

  • 树的存储结构

    树有三种表示方法:双亲表示法、孩子表示法以及孩子兄弟表示法。

    其中双亲表示法是可以通过顺序存储实现的,假设使用一组连续的空间来存储树的结点,同时在每个结点中存储它的双亲在数组中的位置。剩下的两种表示法都要用到链式存储了。

    1. 双亲表示法
    /*树的双亲表示法结点结构定义  */
    #define MAXSIZE 100
    typedef int ElemType;       //树结点的数据类型,暂定为整形
    typedef struct PTNode       //结点结构
    {
        ElemType data;          //结点数据
        int parent;             //双亲位置
    }PTNode;  
    
    typedef struct
    {
        PTNode nodes[MAXSIZE];  //结点数组
        int r,n;                //根的位置和结点数
    }PTree;
    
    1. 孩子表示法
    /*树的孩子表示法结点结构定义  */
    #define MAXSIZE 100
    typedef int ElemType;       //树结点的数据类型,暂定为整形
    typedef struct CTNode       //孩子结点
    {
       int child;
       struct CTNode *next;
    }*ChildPtr;  
    
    typedef struct              //表头结构
    {
       ElemType data;
       ChildPtr firstchild;
    }CTBox;
    typedef struct              //树结构
    {
       CTBox nodes[MAXSIZE];   //结点数组
       int r,n;                //根结点的位置和结点数
    }CTree;
    
    1. 孩子兄弟表示法
    /*树的孩子兄弟表示法结构定义 */
    typedef struct CSNode
    {
       ElemType  data;
       struct CSNode  *firstchild, *rightsib;
    }CSNode, *CSTree;
    

以上,参考这位大神的数据结构之树的三种存储结构

时间: 2024-08-03 19:41:42

树与二叉树之一--基本概念与存储结构的相关文章

二叉树的二叉链表存储结构

一.二叉树的二叉链表存储结构 二叉树的二叉链表存储结构及其操作应用广泛,各大IT公司面试的时候都很喜欢考察二叉树的奇异操作,但是万变不离其宗,只要熟练掌握二叉树的二叉链表存储结构及其基本操作,其它奇异操作根据需要进行变换即可.如下所示: typedef char TElemType; TElemType Nil = ' '; typedef struct BiTNode { TElemType data; // 结点的值 BiTNode *lchild, *rchild; // 左右孩子指针 }

二叉树的二叉链表存储结构及C++实现

前言:存储二叉树的关键是如何表示结点之间的逻辑关系,也就是双亲和孩子之间的关系.在具体应用中,可能要求从任一结点能直接访问到它的孩子. 一.二叉链表 二叉树一般多采用二叉链表(binary linked list)存储,其基本思想是:令二叉树的每一个结点对应一个链表结点链表结点除了存放与二叉树结点有关的数据信息外,还要设置指示左右孩子的指针.二叉链表的结点结构如下图所示: 二叉树结点结构 lchild data rchild 其中,data为数据域,存放该结点的数据信息: lchild为左指针域

【数据结构】树与二叉树的基本概念

1. 树的定义与抽象数据类型 (1) 树的定义 树(Tree)是n(n>=0)个结点的有限集.n=0时称为空树.在任意一棵非空树中: 有且仅有一个特定的称为根(root)的结点: 当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1.T2.…….Tm,其中每一个集合本身又是一棵树,并且称为根的子树(subTree). 需要注意的是: n>0时根结点是唯一的,不可能存在多个根结点,别和现实中的大树混为一起,现实中的树有很多根须,那是真实的树,数据结构中的树是只能有一个根结点:

树(基本概念及存储结构)

树的定义--递归(两者相联系) 根节点:唯一 节点的度:节点拥有的子树数,度为0->称为终端节点或叶节点 树的度:树内各节点的度的最大值 内部节点:除根节点外的节点 孩子(child):节点的子树的根 称为该节点的 孩子,反过来,称为双亲(parent) 兄弟(sibling):同一双亲的孩子之间的关系 节点的祖先:从根到该节点所经分支上的所有节点 节点层次:根为第一层,根的孩子为第二层 树的深度(Depth):树中节点的最大层次 森林(Forest):是m(m>0)棵互不相交的树的集合 树的

_DataStructure_C_Impl:二叉树的二叉链表存储结构

// _DataStructure_C_Impl: #include<stdio.h> #include<stdlib.h> #define MaxSize 100 typedef char DataType; typedef struct Node{ //二叉链表存储结构类型定义 DataType data; //数据域 struct Node *lchild; //指向左孩子结点 struct Node *rchild; //指向右孩子结点 }*BiTree,BitNode;

第五章 树和二叉树

上章回顾 单链表的基本操作,包括插入.删除以及查找 双向链表和循环链表的区别 [email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 第五章 第五章 树和二叉树 树和二叉树 [email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 预习检查 什么是二叉树 树的遍历有哪几种方式 树有哪些应用 [email pr

数据结构实践项目——树和二叉树(1)

本文针对[数据结构基础系列(6):树和二叉树]第1-10课时 1 树结构导学 2 树的基本概念 3 树的基本术语 4 树的性质 5 树的存储结构 6 二叉树概念和性质 7 二叉树与树.森林之间的转换 8 二叉树的存储结构 9 二叉树的基本运算及其实现 10 二叉树的遍历 [项目1 - 二叉树算法库] 定义二叉树的链式存储结构,实现其基本运算,并完成测试. 要求: 1.头文件btree.h中定义数据结构并声明用于完成基本运算的函数.对应基本运算的函数包括: void CreateBTNode(BT

数据结构期末复习第六章树和二叉树

知识点: 先序遍历二叉树规则:根-左-右 1.访问根结点 2.先序遍历左子树 3.先序遍历右子树 中序遍历二叉树规则:左-根-右 1.先中序遍历左子树 2.再访问根节点 3.最后访问中序遍历右子树 后序遍历二叉树规则:左-右-根 1.后序遍历左子树 2.后序遍历右子树 3.访问根结点 1.  一棵二叉树的先序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历结果为(A)A. CBEFDA                       B. FEDCBAC. CBEDFA        

数据结构学习笔记(树、二叉树)

树(一对多的数据结构) 树(Tree)是n(n>=0)个结点的有限集.n=0时称为空树.在任意一颗非空树种: (1)有且仅有一个特定的称为根(Root)的结点: (2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1.T2........Tn,其中每一个集合本身又是一棵树,并且称为根的子树. 对于树的定义还需要强调两点:1.n>0时根结点是唯一的,不可能存在多个根结点,数据结构中的树只能有一个根结点.2.m>0时,子树的个数没有限制,但它们一定是互不相交的. 结点