树
树的定义:
树是n个结点的有限集。在任意一颗非空树中:(1)有且仅有一个特定的根的结点(2)当n>1,其余结点可分为m个互不相交的有限集合,其中每个集合本身又是一棵树,并且成为子树,如下图所示
图中:(a)是只有一个根结点的树;(b)是有13个结点的树,其中A是根,其余结点分成3个互不交集的子集;
- T1={B,E,F,K,L}
- T2={C,G}
- T3={D,H,I,J,M}
T1,T2,T3都是根A的子树,其本身也是一棵树。T1还可以再分:
- T11={E,K,L}
- T12={F}
- T11与T12都是B的子树
结点的分类
树的结点包含一个数据元素及若干指向其子树的分支。结点拥有的子树数称为结点的度,度为零的结点称为叶结点或终端结点;度不为零的结点称为非终端结点或分枝结点。除根结点之外,分支结点也称为内部结点,树的度是树内各结点的度的最大值。
如下图所示:
这颗树结点的度的最大值是结点D的度,为3,所以树的度也为3。
结点间的关系:
结点的子树的根称为该结点的孩子(child),相应地,该结点称为孩子的双亲。
同一个双亲的孩子之间互称兄弟。结点的祖先是从根到该结点所经分支上的所有结点。
例:H结点来说,D,B,A都是它的祖先。
以某结点为根的子树的任意结点都成为该结点的子孙。
B的子孙有D,G,H,I。
树的创建
四种方法可以创建一颗树
(1)二叉链表表示法
(2)三叉链表表示法
(3)双亲链表
(4)线索表示法
下面为代码注释:
1.二叉链表示法
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//打造一颗树
int main()
{
BiTNode t1,t2,t3,t4,t5;//定义5个结点
t1.data = 1;
t2.data = 2;
t3.data = 3;
t4.data = 4;
t5.data = 5;
//打造结点与结点之间的关系
t1.lchild = &t2;
t1.rchild = &t3;
t2.lchild = &t4;
t3.lchild = &t5;
}
2.三叉链表法
typedef struct TriTNode
{
int data;
struct TriTNode *lchild , *rchild;
strcut TriTNode *parent;//父
}TriTNode,*TriTree;
int main()
{
//创建树的结点
BiTNode t1,t2,t3,t4,t5;
t1.data = 1;
t2.data = 2;
t3.data = 3;
t4.data = 4;
t5.data = 5;
//树的关系
t1.lchild = &t2;
t1.rchild = &t3;
t2.lchild = &t4;
t3.lchild = &t5;
return 0;
}
3.双亲链表(较难):
双亲链表名字由来:子结点中保存,了双亲位置的信息
typedef struct BPTNode
{
int data;
int parentPosition;//指向双亲的指针,数组下标
char LRTag;//左右孩子标志域
}BPTNode;
typedef struct BPTree
{
BPTNode node[100];//因为结点是分散的,需要把结点存储到数组中
int num_node;//结点数目
int root;//根节点的位置//此域储存的是父亲结点在数组的下标
}BPTree;
int main()
{
BPTree tree;
//根结点
tree.nodes[0].parentPositon = 1000 ;
//B结点
tree.nodes[1].parentPosition = 0;
tree.nodes[1].data = 'B';
tree.nodes[1].LRTag = 1 ;
//C结点
tree.nodes[2].parentPosition = 0;
tree.nodes[2].data = 'C';
tree.nodes[2].LRTag = 2 ;
system("pasue");
}
二叉树
二叉树的定义:
二叉树是另外一种树形结构,它的特点是每个结点至多只有两棵子树。注意:
- 二叉树的子树有左右之分
- 其次序不能任意颠倒
二叉树的性质:
- 在二叉树的第i层上至多有2*i个结点(i>=1)
- 深度为k的二叉树至多有2*(k+1)次方-1个结点(k>=1)
- 对任意一颗二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1.
- 具有n个结点的完全二叉树的深度为[log2n]+1
二叉树的分类:
1.满二叉树:一颗深度为k且有2k-1个结点的二叉树(特点:每层都充满了结点)
2.完全二叉树:
(1).第k-1层和满二叉树一样
(2).最后一层:叶子结点尽力靠左
注意:左子树是满二叉树,右孩子是满二叉树,且高度均相等,所以才能称为满二叉树
二叉树的存储结构:
顺序存储结构:
按二叉树的结点“自上而下,从左至右”编号,用一组连续的存储单元存储。
缺点:(1)浪费空间;(2)插入,删除不便