python中树与树的表示知识点总结


Posted in Python onSeptember 14, 2019

一、什么是树

客观世界中许多事物存在层次关系

人类社会家谱社会组织结构图书信息管理

其中,人类社会家谱如下图所示:

python中树与树的表示知识点总结

通过上述所说的分层次组织,能够使我们在数据的管理上有更高的效率!那么,对于数据管理的基本操作——查找,我们如何实现有效率的查找呢?

二、查找

查找:根据某个给定关键字K,从集合R中找出关键字与K相同的记录

静态查找:集合中记录是固定的,即对集合的操作没有插入和删除,只有查找

动态查找:集合中记录是动态变化的,即对集合的操作既有查找,还可能发生插入和删除(动态查找不在我们考虑范围内)

2.1 静态查找 2.1.1 方法1:顺序查找

python中树与树的表示知识点总结

/* c语言实现 */

int SequentialSearch (StaticTable *Tbl, ElementType K)
{
// 在表Tbl[1]~Tb1[n]中查找关键字为K的数据元素
 int i;
 Tbl->Element[0] = K; // 建立哨兵,即没找到可以返回哨兵的索引0表示未找到
 for (i = Tbl->Length; Tbl->Element[i] != K; i--); // 查找成功返回所在单元下标;不成功放回0
 return i;
}

顺序查找算法的时间复杂度为O(n)

2.1.2 方法2:二分查找(Binary Search)

假设n个数据元素的关键字满足有序(比如:小到大),即\(k_1<k_2<\cdots<k_n\),并且是连续存放(数组),那么可以进行二分查找。

例:假设有13个数据元素,按关键字由小到大顺序存放。二分查找关键字为444的数据元素过程如下图:

python中树与树的表示知识点总结

仍然以上面13个数据元素构成的有序线性表为例,二分查找关键字为43的数据元素如下图:

python中树与树的表示知识点总结

/* c语言实现 */

int BinarySearch (StaticTable *Tbl, ElementType K)
{
 // 在表中Tbl中查找关键字为K的数据元素
 int left, right, mid, NoFound = -1;
 
 left = 1; // 初始左边界
 right = Tbl->Length; // 初始右边界
 while (left <= right)
 {
  mid = (left + right) / 2; // 计算中间元素坐标
  if (K < Tbl->Element[mid]) right = mid - 1; // 调整右边界
  else if (K > Tbl->Element[mid]) left = mid + 1; // 调整左边界
  else return mid; // 查找成功,返回数据元素的下标
 }
 return NotFound; // 查找不成功,返回-1
}
# python语言实现

def binary_chop(alist, data):
  n = len(alist)
  first = 0
  last = n - 1
  while first <= last:
    mid = (last + first) // 2
    if alist[mid] > data:
      last = mid - 1
    elif alist[mid] < data:
      first = mid + 1
    else:
      return True
  return False

二分查找算法具有对数的时间复杂度O(logN)

二分查找算法虽然解决了查找的时间复杂度问题,但是对于数据的插入和删除确是O(n)的,因此有没有一种数据结构,既可以减少数据查找的时间复杂度,又可以减少数据的插入和删除的复杂度呢?

三、二分查找判定树

除了使用上述两个方法进行关键字的查找,我们还可以通过二叉树这种数据结构完成关键字的查找。

python中树与树的表示知识点总结

从上图可以看出,如果我们需要寻找数字8,可以通过以下4步实现(可能看不懂,未来会看得懂):

根节点6小于8,往6的右子节点9找结点9大于8,往9的左子结点7找结点7小于8,往7的左子结点找找到8 判定树上每个结点需要的查找次数刚好为该结点所在的层数;查找成功时查找次数不会超过判定树的深度 N个结点的判定树的深度为\([log_2{n}]+1\) \(ASL = (4*4+4*3+2*2+1)/11 = 3\) 四、树的定义

树(Tree):\(n(n\geq{0})\)个结点构成的有限集合。

当n=0时,称为空树对于任一颗非空树(n>0),它具备以下性质: 树中有一个称为根(Root)的特殊结点,用r表示其余结点可分为m(m>0)个互不相交的有限集\(T_1,T_2,\cdots,T_m\),其中每个集合本身又是一棵树,称为原来树的子树(SubTree)

python中树与树的表示知识点总结

五、树与非树

牢记树有以下3个特性:

子树是不相交的;除了根结点外,每个结点有且仅有一个父结点;一颗N个结点的树有N-1条边 5.1 非树

python中树与树的表示知识点总结

5.2 树

python中树与树的表示知识点总结

六、树的一些基本术语

python中树与树的表示知识点总结

结点的度(Degree):结点的子树个数树的度:树的所有结点中最大的度数叶结点(Leaf): 度为0的结点父结点(Parent):有子树的结点是其子树的根结点的父结点子结点(Child):若A结点是B结点的父结点,则称B结点是A结点的子结点;子结点也称孩子结点

兄弟结点(Sibling):具有同一父结点的各结点彼此是兄弟结点

路径和路径长度:从结点\(n_1\)到\(n_k\)的路径为一个结点序列\(n_1 , n_2 ,\cdots, n_k\) , \(n_i\)是\(n_{i+1}\)的父结点。路径所包含边的个数为路径的长度

祖先结点(Ancestor):沿树根到某一结点路径上的所有结点都是这个结点的祖先结点

子孙结点(Descendant):某一结点的子树中的所有结点是这个结点的子孙

结点的层次(Level):规定根结点在1层,其它任一结点的层数是其父结点的层数加1

树的深度(Depth):树中所有结点中的最大层次是这棵树的深度

七、树的表示

7.1 树的链表表示

python中树与树的表示知识点总结

上图所示树的链表表示法有很大的缺陷,假设树的深度非常大,并且不能保证所有树的子结点都有3个,那么会造成很大程度的浪费。

7.2 树的链表(儿子-兄弟)表示法

为了解决树的普通链表表示会有空间的浪费的缺陷,我们可以把链表的指针设置两个链接,一个链接指向儿子结点,另一个链接指向兄弟结点,如下图所示:

python中树与树的表示知识点总结

上图所示的树的表示方法,已经足够完美了,但是如果我们把链表表示的树旋转45°角,会发现如下图所示:

python中树与树的表示知识点总结

经过45°角的旋转,我们会发现一颗二叉树(一个结点至多拥有2个子结点的树),也就是说最普通的树其实可以通过二叉树表示,也就是说我们只要把二叉树研究透了,我们即研究透了树。

以上就是本次全部相关知识点内容,感谢大家的阅读和对三水点靠木的支持。

Python 相关文章推荐
python基础教程之udp端口扫描
Feb 10 Python
django模型中的字段和model名显示为中文小技巧分享
Nov 18 Python
python之当你发现QTimer不能用时的解决方法
Jun 21 Python
python输出电脑上所有的串口名的方法
Jul 02 Python
python os模块常用的29种方法使用详解
Jun 02 Python
Python包和模块的分发详细介绍
Jun 19 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
Jul 28 Python
Python如何使用input函数获取输入
Aug 06 Python
Python实现EM算法实例代码
Oct 04 Python
pytorch 实现L2和L1正则化regularization的操作
Mar 03 Python
教你如何使用Python下载B站视频的详细教程
Apr 29 Python
python 详解turtle画爱心代码
Feb 15 Python
python树的同构学习笔记
Sep 14 #Python
python图形绘制奥运五环实例讲解
Sep 14 #Python
python列表插入append(), extend(), insert()用法详解
Sep 14 #Python
postman传递当前时间戳实例详解
Sep 14 #Python
Python 经典算法100及解析(小结)
Sep 13 #Python
python中如何实现将数据分成训练集与测试集的方法
Sep 13 #Python
Python函数中的可变长参数详解
Sep 12 #Python
You might like
如何对PHP程序中的常见漏洞进行攻击
2006/10/09 PHP
使用php统计字符串中中英文字符的个数
2013/06/23 PHP
php插入排序法实现数组排序实例
2015/02/16 PHP
用PHP代码在网页上生成图片
2015/07/01 PHP
基于php中echo用逗号和用点号的区别详解
2018/01/23 PHP
php 截取中英文混合字符串的方法
2018/05/31 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
JavaScript与Image加载事件(onload)、加载状态(complete)
2011/02/14 Javascript
使用jQuery validate 验证注册表单实例演示
2013/03/25 Javascript
深入分析js的冒泡事件
2014/12/05 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
JS尾递归的实现方法及代码优化技巧
2019/01/19 Javascript
VSCode使用之Vue工程配置eslint
2019/04/30 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
Javascript实现鼠标点击冒泡特效
2019/12/24 Javascript
微信小程序换肤功能实现代码(思路详解)
2020/08/25 Javascript
Vue中正确使用Element-UI组件的方法实例
2020/10/13 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
2021/02/05 Javascript
[01:03]悬念揭晓 11月26日DOTA2完美盛典不见不散
2017/11/23 DOTA
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
Python3中简单的文件操作及两个简单小实例分享
2017/06/18 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
2019/11/29 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
茶叶生产计划书
2014/01/10 职场文书
美术教学感言
2014/02/22 职场文书
法人代表任命书范本
2014/06/05 职场文书
印刷技术专业自荐信
2014/09/18 职场文书
十大公认最好看的动漫:《咒术回战》在榜,《钢之炼金术师》第一
2022/03/18 日漫
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers