浅谈关于数据结构中的树

来源:互联网 发布:卖esse爱喜烟的淘宝店 编辑:程序博客网 时间:2024/06/05 16:25

树的定义:

​ 在计算机科学中,(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

  • 每个节点有零个或多个子节点;

  • 没有父节点的节点称为根节点;

  • 每一个非根节点有且只有一个父节点;

  • 除了根节点外,每个子节点可以分为多个不相交的子树;

二叉树(Binary Tree)

​ 一种特殊的树结构,其特点是每个结点至多有两颗子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,即为有序树。

满二叉树: 一棵深度为k且有 2^k-1个节点的二叉树。

完全二叉树: 对满二叉树的结点进行连续编号,约定编号从根节点开始,自上而下,自左至右。深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应。

二叉树的性质

性质1 在二叉树的第i层上至多有2^(i-1)个节点(i>=1)。

性质2 深度为k的二叉树至多有2^k -1个结点(k>=1)。

性质3 对于任意一棵二叉树T,如果其终端结点数为n0,度为2的结点树为n2,则有 n0 = n2 +1;

性质4 具有n个结点 的完全二叉树的深度为floor(logn)+1(此处floor意为取下整)。

性质5 如果对一棵有n个节点的完全二叉树的结点按层序编号,则对任一节点i(1<=i<=n),有

​ (1) 如果i=1,则节点i是二叉树的根,无双亲;如果i>1,则其双亲PARENT(i)是结点 floor(i/2)。

​ (2) 如果2i >n, 则结点i无左孩子;否则其左孩子为节点2i。

​ (3) 如果2i +1 >n, 则结点i无右孩子;否则其右孩子为结点2i+1.

树的术语:

  1. 节点的度:一个节点含有的子树的个数称为该节点的度;
  2. 树的度:一棵树中,最大的节点的度称为树的度;
  3. 叶节点终端节点:度为零的节点;
  4. 非终端节点分支节点:度不为零的节点;
  5. 父亲节点父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
  6. 孩子节点子节点:一个节点含有的子树的根节点称为该节点的子节点;
  7. 兄弟节点:具有相同父节点的节点互称为兄弟节点;
  8. 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  9. 深度:对于任意节点n,n的深度为从根到n的唯一路径长,根的深度为0;
  10. 高度:对于任意节点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0;
  11. 堂兄弟节点:父节点在同一层的节点互为堂兄弟;
  12. 节点的祖先:从根到该节点所经分支上的所有节点;
  13. 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
  14. 森林:由m(m>=0)棵互不相交的树的集合称为森林;

树的种类:

  • 无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树;

  • 有序树:树中任意节点的子节点之间有顺序关系,这种树称为有序树;

    二叉树:每个节点最多含有两个子树的树称为二叉树;

    ​ 完全二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达 最大值,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树;

    • 满二叉树:所有叶节点都在最底层的完全二叉树;

    • 平衡二叉树(AVL树):当且仅当任何节点的两棵子树的高度差不大于1的二叉树;

    • 排序二叉树(二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树);

    • 霍夫曼树:带权路径最短的二叉树称为哈夫曼树或最优二叉树;

    • B树:一种对读写操作进行优化的自平衡的二叉查找树,能够保持数据有序,拥有多余两个子树。

树的直径:

树的直径是指树的最长简单路。求法: 两遍搜索S :先任选一个起点BFS找到最长路的终点,再从终点进行BFS,则第二次搜索找到的最长路即为树的直径;
原理: 设起点为u,第一次搜索找到的终点v一定是树的直径的一个端点
证明:

1) 如果u 是直径上的点,则v显然是直径的终点(因为如果v不是的话,则必定存在另一个点w使得u到w的距离更长,则于BFS找到了v矛盾)
2) 如果u不是直径上的点,则u到v必然于树的直径相交(反证),那么交点到v 必然就是直径的后半段了

树的重心:

树的重心也叫树的质心。对于一棵树n个节点的无根树,找到一个点,使得把树变成以该点为根的有根树时,最大子树的结点树最小。换句话说,删除这个点后最大连通块(一定是树)的结点数最小

树的重心性质:

1.树中所有点到某个点的距离和中,到重心的距离和是最小的;如果有两个重心,那么他们的距离和一样。

2.把两个树通过一条边相连得到一个新的树,那么新的树的重心在连接原来两个树的重心的路径上。

3.把一个树添加或删除一个叶子,那么它的重心最多只移动一条边的距离。

树的分治:

树的分治算法是分治思想在树型结构上的体现。

任一个具有n个节点的连通路,它的任何一棵树的树枝数为n-1

分治:除去树中的某些对象,使原树被分解成若干互不相交的部分。

分治算法分为两种:一种是点的分治,一种是边的分治

1.基于点的分治

img

1.选取一个点将无根树转为有根树

2.递归处理每一颗以根结点的儿子为根的子树

img

2.基于边的分治

img

1.在树中选取一条边

  1. 将原有的树分成两棵不相交的树,递归处理。

img

可以证明在基于点的分治中,如果每次都选取树的重心,那么至多递归
O(LogN)次。

img

基于边的分治最坏情况下递归次数为O(N)

img

例题:

原创粉丝点击