数据结构-树(tree)

来源:互联网 发布:淘宝直播回放怎么下载 编辑:程序博客网 时间:2024/06/14 04:57

本篇文章先介绍关于树的一些基础概念。

常见的数组、链表、栈和队列都是线性结构,在存储大量数据时访问速度比较慢,而树(tree)则是一种非线性结构,使得访问时间复杂度降低到O(logn)。

生活中跟树的结构类似的结构就是族谱。每一个家族都有一个祖先,祖先生养了几个孩子,每个孩子又继续生养孩子,不断递归直到最年轻的一代成员。

族谱

树

树的专业术语:
(1) 树中一个最基本的数据称为一个节点(node),对应族谱中的每一个成员。
(2) 每个树都有一个根节点(root),这对应了族谱中最老的祖先,整个树只有一个根。还可以继续递归定义,以某个节点为一个根节点,从这个节点往下形成一棵子树(sub-tree)。
(3) 整棵树最年轻的一代,在树中称为树的叶节点(leaf node)。根节点和叶节点之间的节点称为内部节点(internal node)。
(4) 每个父辈有几个孩子,每个孩子有其父辈,还有其祖辈。父辈称为父节点(parent),孩子称为子节点(child)。每个父节点可以对应一个或者多个子节点,一个子节点只能有一个父节点。具有相同父节点的节点称为兄弟节点(siblings)
(5) 度:每个节点的子节点的个数就是这个节点的度。树中所有节点的最大度就是树的度。
(6) 从树的根节点开始是一棵树的第一层(有时候也从第0层开始),它的子节点就是第2层,以此类推。节点的深度从根节点往下累加,而节点的高度从叶节点凯斯往上累加。
(7) 森林(Forest):由多棵不相交的树的集合。

树的一些性质:
(1) 树的节点数等于所有节点的度数加1.(根节点没有父节点)
(2) 度为m的树中第i层上至多有m^(i-1)个节点 (i >= 1)
(3) 高度为h的m叉树最多有(m^h-1) / (m - 1)个节点
(4) 具有n个节点的m叉树的最小高度为ceil(logm(n(m-1)+1))

最常见的树结构就是二叉树,即每个节点最多有两个子节点,分为称为左子节点和右子节点。
二叉树

typedef struct node{    int val;    struct node *left;    struct node *right;}Node;

除了二叉树以外,树的更一般结构中一节点不止两个子节点,而是多个子节点。实现形式通常有一下两种:
1. 数组指针
最简单粗暴的方法就是直接在每个节点中用数组存储指向各个子节点的指针。假如树是一颗M叉树,则可以定义节点如下:

typedef struct node{    int val;    struct node* childs[M];}Node;

但是这种方法需要大量的空间来存储指针,并且如果树比较稀疏,那么很多指针空间就被浪费掉了。所以这种存储结构适合稠密树,并且知道是几叉树的情况下的存储。

2. 左孩子-右兄弟表示法(First child/next sibling representation)
这种方法将一棵多叉树表示成二叉树的形式,每个节点存储两个指针,分别指向其第一个子节点和其邻近的兄弟节点。

这里写图片描述

typedef struct node{    int val;    struct node *child;    struct node *sibling;}Node;

这种存储方式不会像数组存储方式一样浪费大量空间,但是在遍历树或者获取相关节点的时候操作比较麻烦,没有数组存储方式简便。

0 0
原创粉丝点击