数据结构--树

简介

树,是一种非线性的存储结构,存储的是“一对多”关系的数据元素的集合数据结构--树_第1张图片
如图A就是存储了{ABCDEFGHIJKLM}的树的示意图,对于数据A来说,BCD是和A有关系的,对于数据B来说,E和F是和B有关系的,这就是“一对多”关系

基本术语

结点:树中的一个独立单元,包含一个数据元素及若干指向其子树的分支,也就是数据元素个体,如ABC等
结点的度:结点拥有的子树数称为结点的度,例如A的度为3,B的度为2,C的度为1,K的度为0
树的度:树中各结点度的最大值,例如图中树的度为3
叶子:度为0的结点称为叶子或者终端结点,结点KLFGMIJ都是树的叶子
双亲和孩子:结点的子树的根称为该结点的孩子,相应的,该结点称为孩子的双亲,例如B的双亲为A,且B有孩子EF;E的双亲为B,孩子为KL
兄弟:同一个双亲的孩子之间互称兄弟,例如HIJ互为兄弟
树的深度:树中结点的最大层次称为树的深度或高度,图中树的深度为4


二叉树

定义

  1. 有且只有一个称之为根的结点
  2. 除了根结点之外的其余结点分为两个互不相交的子集,称为其的左子树和右子树

二叉树与树的区别:

  1. 二叉树每个结点至多只有两棵子树(即没有大于2的结点)
  2. 二叉树的子树有左右之分,其次序不能任意颠倒

根据定义可以有以下五种基本形态
数据结构--树_第2张图片

二叉树的性质

性质一 :在二叉树的第i层上至多有2i-1个结点(i>=1)
性质二:深度为k的二叉树至多有2k-1个结点(k>=1)
性质三:对于任何一颗二叉树,其叶子结点数为n0,度为2的结点数为n2,则n0 = n2 + 1
性质四:具有n个结点的完全二叉树的深度为log2n + 1(向下取整,n>0)

满二叉树

特点:每一层上的结点数都是最大结点数,即每一层i的结点数都是最大值2i

完全二叉树

特点:

  1. 叶子结点只能在层次最大的两层上出现
  2. 对任一结点,若其右分支的的子孙的最大层次为l,则其左分支的子孙的最大层次必是l或l+1
满二叉树和完全二叉树的比较

数据结构--树_第3张图片


二叉树的存储结构

  • 顺序存储结构

    • 顺序存储结构使用一组地址连续的存储单元来存储数据元素(例如数组),为了在存储结构中反映出结点之间的逻辑关系,必须按照一定规律安排在存储单元中
    • 对于完全二叉树来说可以直接依次自上而下,自左至右存储结点,如图所示
    • 而对于一般二叉树来说,每个结点需要与完全二叉树对应,用0表示不存在的结点数据结构--树_第4张图片
      但是用这种方法可能会造成极大的浪费,于是我们就使用另一种方法
  • 链式存储结构

    • 由二叉树的定义可知,二叉树的结点由数据单元和指向左右孩子结点的分支构成,所以一般来说结点结构由左图所示的数据域和左、右指针域组成,但有时为了便于找到双亲结点,会添加一个指向双亲结点的指针域数据结构--树_第5张图片
/*
----结点的存储表示----
*/
typedef struct BiTree{
	ElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

下一章树的操作,暂时先鸽了

你可能感兴趣的:(#C语言,数据结构)