浅谈关于数据结构中的树

树的定义:

​ 在计算机科学中,(英语: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

例题:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值