56.树与树算法

树的概念

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

  • 每个节点有零个或多个子节点;
  • 没有父节点的节点称为根节点;
  • 每一个非根节点有且只有一个父节点;
  • 除了根节点外,每个子节点可以分为多个不相交的子树;

树的术语

  • 节点的度:一个节点含有的子树的个数称为该节点的度;
  • 树的度:一棵树中,最大的节点的度称为树的度;
  • 叶节点终端节点:度为零的节点;
  • 父亲节点父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
  • 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
  • 兄弟节点:具有相同父节点的节点互称为兄弟节点;
  • 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  • 树的高度深度:树中节点的最大层次;
  • 堂兄弟节点:父节点在同一层的节点互为堂兄弟;
  • 节点的祖先:从根到该节点所经分支上的所有节点;
  • 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
  • 森林:由m(m>=0)棵互不相交的树的集合称为森林;

树的种类

  • 无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树;
  • 有序树:树中任意节点的子节点之间有顺序关系,这种树称为有序树;
    • 二叉树:每个节点最多含有两个子树的树称为二叉树;

      • 完全二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树,其中满二叉树的定义是所有叶节点都在最底层的完全二叉树;
      • 平衡二叉树(AVL树):当且仅当任何节点的两棵子树的高度差不大于1的二叉树;
      • 排序二叉树(二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树);
    • 霍夫曼树(用于信息编码):带权路径最短的二叉树称为哈夫曼树或最优二叉树;
    • B树:一种对读写操作进行优化的自平衡的二叉查找树,能够保持数据有序,拥有多余两个子树。

树的存储与表示

顺序存储:将数据结构存储在固定的数组中,然在遍历速度上有一定的优势,但因所占空间比较大,是非主流二叉树。二叉树通常以链式存储。 

链式存储:

由于对节点的个数无法掌握,常见树的存储表示都转换成二叉树进行处理,子节点个数最多为2

常见的一些树的应用场景

1.xml,html等,那么编写这些东西的解析器的时候,不可避免用到树
2.路由协议就是使用了树的算法
3.mysql数据库索引
4.文件系统的目录结构
5.所以很多经典的AI算法其实都是树搜索,此外机器学习中的decision tree也是树结构

57.二叉树的概念

二叉树的基本概念

二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)

二叉树的性质(特性)

性质1: 在二叉树的第i层上至多有2^(i-1)个结点(i>0)
性质2: 深度为k的二叉树至多有2^k - 1个结点(k>0)
性质3: 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
性质4:具有n个结点的完全二叉树的深度必为 log2(n+1)
性质5:对完全二叉树,若从上至下、从左至右编号,则编号为i 的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必为i/2(i=1 时为根,除外)

58.二叉树的广度优先遍历

二叉树的节点表示以及树的创建

class Node(object):"""节点类"""def __init__(self, item):self.item = itemself.lchild = Noneself.rchild = Noneclass Tree(object):"""树类"""def __init__(self):self.root = None

59.二叉树的实现

二叉树的实现

class Node(object):"""节点类"""def __init__(self, item):self.item = itemself.lchild = Noneself.rchild = Noneclass Tree(object):"""树类"""def __init__(self):self.root = Nonedef add(self,item):node = Node(item)if self.root is None:self.root = nodereturnqueue = [self.root]while queue:cur_node = queue.pop(0)if cur_node.lchild is None:cur_node.lchild = nodereturnelse:queue.append(cur_node.lchild)if cur_node.rchild is None:cur_node.rchild = nodereturnelse:queue.append(cur_node.rchild)

60.二叉树的先序、中序、后序遍历

广度优先遍历(层次遍历)

从树的root开始,从上到下从从左到右遍历整个树的节点

def breadth_travel(self):"""利用队列实现树的层次遍历"""if self.root is None:returnqueue = [self.root]while queue:cur_node = queue.pop(0)print(cur_node.item)if cur_node.lchild is not None:queue.append(cur_node.lchild)if cur_node.rchild is not None:queue.append(cur_node.rchild)    if __name__ == "__main__":tree = Tree()tree.add(1)tree.add(2)tree.add(3)tree.add(4)tree.add(5)tree.breadth_travel()
1
2
3
4
5

深度优先遍历

对于一颗二叉树,深度优先搜索(Depth First Search)是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。
那么深度遍历有重要的三种方法。这三种方式常被用于访问树的节点,它们之间的不同在于访问每个节点的次序不同。这三种遍历分别叫做先序遍历(preorder),中序遍历(inorder)和后序遍历(postorder)。我们来给出它们的详细定义,然后举例看看它们的应用。

先序遍历

在先序遍历中,我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树
根节点->左子树->右子树

def preorder(self, node):"""递归实现先序遍历"""if node == None:returnprint(node.item)self.preorder(node.lchild)self.preorder(node.rchild)

中序遍历

在中序遍历中,我们递归使用中序遍历访问左子树,然后访问根节点,最后再递归使用中序遍历访问右子树
左子树->根节点->右子树

def inorder(self, node):"""递归实现中序遍历"""if node == None:returnself.inorder(node.lchild)print(node.item)self.inorder(node.rchild)

后序遍历 在后序遍历中,我们先递归使用后序遍历访问左子树和右子树,最后访问根节点
左子树->右子树->根节点

def postorder(self, node):"""递归实现后续遍历"""if node == None:returnself.postorder(node.lchild)self.postorder(node.rchild)print(node.item)

61.二叉树由遍历确定一棵树

二叉树由遍历确定一棵树

后续遍历:7 8 3 9 4 1 5 6 2 0       左右根

中序遍历:7 3 8 1 9 4 0 5 2 6       左根右

  1. 后续遍历最后一位为0,说明根是0
  2. 中序遍历:7 3 8 1 9 4           0          5 2 6
  3. 后续遍历:7 8 3 9 4 1            5 6 2       0
  4. 7 8 3 9 4 1最后一位是1,说明根是1
  5. 中序遍历:7 3 8    1    9 4     0        5 2 6

Python数据结构与算法(第七天)相关推荐

  1. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  2. Python天天美味(32) - python数据结构与算法之堆排序

    1. 选择排序 选择排序原理是先选出最小的数,与第一个数交换,然后从第二个数开始再选择最小的数与第二个数交换,-- def selection_sort(data):     for i in ran ...

  3. python数据结构与算法13_python 数据结构与算法 (13)

    python 数据结构与算法 (13) 选择排序 (Selection sort) 是? 种简单直观的排序算法. 它的? 作原理如 下.? 先在未排序序列中找到最?(?)元素, 存放到排序序列的起始位 ...

  4. python leetcode_leetcode 介绍和 python 数据结构与算法学习资料

    for (刚入门的编程)的高中 or 大学生 leetcode 介绍 leetcode 可以说是 cs 最核心的一门"课程"了,虽然不是大学开设的,但基本上每一个现代的高水平的程序 ...

  5. Python数据结构与算法(二)栈和队列

    本系列总结了python常用的数据结构和算法,以及一些编程实现. 参考书籍:<数据结构与算法 Python语言实现> [美]Michael T.Goodrich, Roberto Tama ...

  6. Python数据结构与算法(一)列表和元组

    本系列总结了python常用的数据结构和算法,以及一些编程实现. 参考书籍:<数据结构与算法 Python语言实现> [美]Michael T.Goodrich, Roberto Tama ...

  7. Python 数据结构与算法——快排

    Python 数据结构与算法--选取算法(TopK) 如果说快速选取法所代表的是剪枝式的遍历操作--在递归树中找出一条通往第 k<script type="math/tex" ...

  8. Python 数据结构与算法——从二分图到寻找最大排列(Maximum Permutation)

    假设现在有 8 位有着特殊癖好的人去买票看电影,其中有一部分人得到了自己喜欢的座位,但大多数人并不满意.现在的问题是,如果这些人各自都有自己喜欢的座位(喜欢的座位有重叠,这是进行最大排列的前提,否则无 ...

  9. Python数据结构与算法(4.1)——递归

    Python数据结构与算法(4.1)--递归 0. 学习目标 1 递归 1.1 递归的基本概念 1.2 递归的重要性 1.3 递归三原则 1.4 递归的应用 2 递归示例 2.1 列表求和 2.2 汉 ...

  10. Python数据结构与算法(3.5)——双端队列

    Python数据结构与算法(3.5)--双端队列 0. 学习目标 1. 双端队列的基本概念 1.1 双端队列的基本概念 1.2 双端队列抽象数据类型 2. 双端队列的实现 2.1 顺序双端队列的实现 ...

最新文章

  1. SAP WMSD集成之Copy WM Quantity – Copy WM qty as delivery qty into delivery
  2. IDE之EcliPse:EcliPse软件的简介、安装、入门、使用方法之详细攻略
  3. TF之TFOD-API:基于tensorflow框架利用TFOD-API脚本文件将YoloV3训练好的.ckpt模型文件转换为推理时采用的.pb文件
  4. 【五校联考7day2】QYQ的图
  5. SAP 电商云 Spartacus UI feature level directive 的工作原理
  6. AS(Autonomous System)
  7. (九)深入浅出TCPIP之网络同步异步
  8. C++多重继承师生类复盘
  9. 德佑地产房产经纪人区域总监访谈:掌门的态度
  10. 红安一中高考2021成绩查询,红安一中2019高考喜报成绩、一本二本上线人数情况...
  11. Python+tkinter模拟京东登录时拖动图片式验证码
  12. Himall商城普通帮助类(一)
  13. 32位win10服务器系统,32位win10原版
  14. rpg人物制作软件_RPG游戏制作教程
  15. excel求回归直线方程的公式_求回归直线方程的三种方法
  16. [数字媒体] PR视频剪辑之竖屏实现横屏旋转切换和大视频文件缩小
  17. android 自动语音提醒,Android 语音播报实现方案
  18. wr885n虚拟服务器设置,TP-Link TL-WR885N V4路由器上网设置方法
  19. 2017年7月最新全国行政规划数据库
  20. 推荐一些助你看透世界本质的书

热门文章

  1. Android中的基础控件CheckBox、RadioButton、ToggleButton、SeekBar
  2. Qt中线程的生命期问题
  3. 解决bug_赛博朋克2077BUG卡关怎么办?卡关BUG解决办法
  4. 生成html页面的ftl文件,FreeMarker生成静态HTML页面的工具类FreeMarkerUtil
  5. C++虚继承下的内存模型(一)
  6. yolov3 数据预处理
  7. Leetcode 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 (每日一题 20210917)
  8. 5-spark学习笔记-spark集群应用与监控
  9. 推荐系统笔记(内容推荐)
  10. XGBoost相关知识-1