数据结构——3.1树与树的表示

一、引言

  1. 层次结构举例
    家谱、城市(乡镇),文件管理系统等
  2. 为什么用层次结构呢?
    分层次组织在管理上具有更高的效率
  3. 查找
    静态查找:对查找的集合没有插入和删除操作,只有查找
    动态查找:对查找的集合除查找外,还可能发生插入和删除
  4. 二分查找的启示
    例如11个元素的二分查找判定树
    在这里插入图片描述
    1)判定树上每个结点需要的查找次数刚好是该结点所在的层数
    2)查找成功时查找次数不会超过判定树的深度
    3)n个结点的判定树的深度为(int)(logn)+1
    4)平均查找次数ASL=(44+43+2*2+1)/11=3
    要找4次的有4个(最底下那一层的四个结点),找3次的也有4个,找2次的有2个,找1次的有1个。
那么,如果我们不用数组的形式而是把数据放在这样的一个层次化结构里,是不是也能达到二分查找的效果

二、树的定义

树(Tree):n(n>=0)个结点构成的有限集合。当n=0时,称为空树,对于任何一个非空树(n>0),具备以下性质:
1)树中有一个称为“根(root)”的特殊结点,用r表示
2)其余结点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每个集合本身又是一棵树,称为原来树的**“子树”(SubTree)**
在这里插入图片描述
采用一种递归的方法来说明这样的一个树

1、树与非树

在这里插入图片描述
1)子树是不相交
2)除了根节点外,每个结点有且仅有一个父节点
3)一棵N个结点的树有N-1条边(因为每个结点都有往上的一条边,只有根节点没有)
树是保证结点联通的边最少的一种连接方式。

2、树的基本术语

1)结点的度(Degree):结点的子树个数(每个结点连到往下的边的个数,也就是子树的个数)
2)树的度:树的所有结点中最大的度数
3)叶结点(Leaf)度为0的结点(没有子树的结点)
4)父结点(parent):有子树的结点是其子树的根节点的父结点
5)子结点(child):若A结点是B结点的父结点,则称B结点是A结点的子结点;子结点也称孩子结点
6)兄弟结点(Sibiling):具有同一父结点的各结点彼此是兄弟结点
7)路径和路径的长度:从结点n1到nk的路径为一个结点序列,n1,n2,…,nk,nj是nj+1的父结点路径所包含边的个数称为路径的长度
8)祖先结点(Ancestor):沿树根到某一结点路径上的所有其他结点都是这个结点的祖先结点。
9)子孙结点(Descendant):某一结点的子树中的所有结点是这个结点的子孙
10)结点的层次(Level):规定根节点在1层,其他任何一结点的层数是其父结点的层数加1
11)树的深度(Depth):树中所有结点中的最大层次是这棵树的深度

3、树的表示

1)倘若用数组来表示,其实有点困难,因为很难去表示它的父结点、子结点是哪一个元素。
2)倘若用链表表示,那么就是用一个结构去表示这个结点,但是这样每个结构的形式是不一样的(因为有些有3个儿子,有些有2个儿子)
假如每个结点都用同样的结构去表示,带来的问题是,如果这个树有n个结点,每个结点有k个指针域,那么就有nk个指针域,而边只有n-1条,也就是说只有n-1个指针域是非零的,就有nk-n+1个指针是空的,那么久会造成空间上的浪费
比较好的方法是:
3)儿子-兄弟表示法
每个结点的结构是统一的,而且空间浪费也不大。n个结点是2n个指针域,其中有n-1条边,所以意味着有n-1个指针域是非空的,那么真正空的域是n+1
在这里插入图片描述
如果从根结点开始访问其“次子”的“次子”,所经过的结点应该是从根结点开始访问其“长子”的“长子”的“长子”的“长子”
把上面的方法旋转45°,这个时候看到的是一个每个结点都有两个指针的树,一个指针指向左边,一个指向右边,每个结点最多是两个儿子。这种树叫做二叉树,即度为2的树。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/CSDN_dzh/article/details/83714057
今日推荐