文章目录
树的定义
非线性数据结构,以分支关系定义的层次结构
定义:树是n个结点的有限集T
结点:树中的元素,包括数据项以及指向其子树的分支
结点的度:节点的子树个数
叶子:度为0的结点
双亲:孩子结点的上层结点
兄弟:同一双亲的孩子
树的度:一棵树中最大的节点度数
二叉树
定义
二叉树是n个结点的有限集,由一个根结点和两颗分别称为左子树和右子树的互不相交的二叉树构成。
性质
一、在二叉树的第i
层上至多有2^(i-1)
个结点
二、深度为k
的二叉树上至多有2^k-1个
结点
满二叉树:深度为k
且有2^k-1
个结点的二叉树。
完全二叉树:深度为k,有n个结点的二叉树二叉树其每一个结点都与深度为k的慢二叉树中编号从1到n的结点一一对应。
性质:
①具有n个结点的完全二叉树的深度为log2(n)
向下取整+1。
②双亲结点编号为i/2
向下取整
③若2i<=n
,则节点左孩子编号为2i
;若2i>n
,则该结点无左孩子;
④若2i+1<=n
,则该结点的右孩子编号为2i+1
;若2i+1>n
,则该结点无右孩子。
树形结构的存储
树的存储
一、双亲表示法
节点结构
typedef struct PTNode
{ TElemType data;//数据域
int parent;//双亲域
}PTNode;
树结构
#define TreeSize 100
typedef struct
{ PTNode nodes[TreeSize];//用一个数组来存储全部节点数据
int r,n;//根结点在一维数组中的下标、结点总数
}
二、孩子表示法
孩子结点
typedef struct CTNode
{ int child;
struct CTNode *next;
}*ChildPtr;//该结构体被ChildPtr指针指着
数组结点
typedef struct
{ TElemType data;//结点元素
ChildPtr firstchild;//指向孩子结点的指针
}CTBox;
树结构
typedef struct
{ CTBox nodes[TreeSize];//数组储存数组结点
int r,n;//根结点在数组中的下标、结点总数
}CTree;
三、带双亲的孩子链表
四、孩子、兄弟表示法
特点:操作简单、破坏了树的层次
结点结构
typedef struct CSnode
{ ElemType data;//数据域
struct CSnode *firstchild,*nextsibling
}CSNode,*CSTree;
二叉树的存储结构
顺序储存结构
定义新类型名的基本步骤
int a[100];//写出定义变量的普通形式
int ARRAY[100];//将变量名替换为新的类型名
typedef int ARRAY[100];//在前面加上typedef
ARRAY b;//即可用新类型名定义变量
#define Tree_Size 100 //二叉树中的结点数目
typedef TElemType SqBiTree[Tree_Size];//定义了一个新的类型名(数据表)
SqiBiTree T;
链式存储——二叉链表
typedef struct BiTNode
{ TElemType data;//数据域
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
链式存储——三叉链表
typedef struct TriTNode
{ TElemType data; //数据域
struct TriTNode *lchild, *rchild, *parent;
}TriNode, *TriTree;
树与二叉树的相互转换
孩子-兄弟存储法与二叉链表存储在内存上是一致的
以二叉链表为对应关系,一棵树可与唯一的一颗二叉树对应。
用二叉树表示一棵树可将对复杂的树的操作转换为对简单二叉树的操作(连兄弟,断父子)