什么是树

数是一种抽象的数据类型(ADT)或是作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合,它是由n(n>1)的有限个节点和节点之间的边组成的一个有层次关系的集合。

树的组成元素:

  • 根节点:树的最上层的节点,任何非空的树都有一个节点
  • 路径:从起始节点到终止节点经历过的路径
  • 父节点:除了根节点,每个节点的上一层边连接的节点就是它的父节点
  • 子节点:每一节点由边指向的下一层节点
  • 兄弟节点:同一父节点且处在同一层的节点
  • 子树:每个节点包含它所有的后代组成的子树
  • 叶子节点:没有子节点的节点,称为叶子节点
  • 树的高度或深度:树中节点的最大层次

树具有以下的特点:

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

树的种类

  • 无序树:树中的任意节点的子节点之间没有顺序关系,也称为自由树。
  • 有序树:树中的任意节点的子节点之间有顺序关系。
  • 二叉树:每个节点最多含有两个子树
  • 完全二叉树:当一个高度为h的完美二叉树减少到h-1,并且最底层的槽被毫无间隙地从左到右填充,我们就叫它完全二叉树
  • 满二叉树:如果每个内部节点(非叶子节点)都有两个子节点,就成为满二叉树
  • 完美二叉树:当所有的叶子节点都在同一层就是完美二叉树,毫无间隙填充了h层

  如下图所示:

  满二叉树:

  

  完美二叉树:

  

  完全二叉树:

  

数的存储和表示

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

如下图所示是简单的顺序存储:

链式存储: 结构采用链表存储二叉树中的数据元素,用链表建立二叉树中节点之间关系,二叉树最常用的链式存储结构是二叉链,每个节点包含三个域,分别是数据元素域data,

左还在链域Child和右孩子链域Child,与单链表头结点和不带头节点的两种情况相似,二叉链存储结构的二叉树也有带头节点和不带头结点两种。

树的常用场景

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

二叉树

二叉树的基本概念

二叉树是由n(n>=0)个节点组成的集合,每个节点最多有两个子树的有序树,它或者是空集,或者是一个根和左右子树的两个不相交的二叉树组成。

二叉树的特点:

二叉树是有序树,即使是只有一个子树,也必须区分左右树。

二叉树的每个节点的的度,不能大于2.

二叉树的遍历

前序遍历:先访问根节点, 然后前序遍历左子树,再前序遍历右子树

中序遍历:中序遍历根节点的左子树,然后再访问根节点,最后遍历右子树

后序遍历:从左到右叶子节点的方式遍历访问左子树,最后访问根节点

层序遍历:从根节点从上往下逐层遍历,在同一层,按从左到右的顺序对节点逐个访问

二叉树实现方式:

# 节点定义
class Node(object):def __init__(self, value, left_child, right_child):self._value = valueself._left_child = left_childself._right_child = right_child@propertydef value(self):return self._value@value.setterdef value(self, value):self._value = self.value@propertydef left_child(self):return self._left_child@left_child.setterdef left_child(self, value):self._left_child = value@propertydef right_child(self):return self._right_child@right_child.setterdef right_child(self, value):self._right_child = value# 树的定义
class Tree(object):def __init__(self, value):self._root = Node(value, None, None)@propertydef root(self):return self._root

遍历树的代码实现:以下遍历方式亲测有效

# 递归后续遍历def pre_order(root):if not isinstance(root, Node):return []pre_order_tmp = []if root is not None:pre_order_tmp.append(root.value)pre_order_tmp += pre_order(root.left_child)pre_order_tmp += pre_order(root.right_child)return pre_order_tmp# 非递归后续遍历
def pre_order_not_recursion(root):if not isinstance(root, Node):return Nonestack = [root]result = []while stack:node = stack.pop(-1)if node:if isinstance(node, Node):result.append(node.value)stack.append(node.right_child)stack.append(node.left_child)else:result.append(node)return result# 递归中序遍历
def middle_order(root):if not isinstance(root, Node):return []middle_order_tmp = []if root is not None:middle_order_tmp += middle_order(root.left_child)middle_order_tmp.append(root.value)middle_order_tmp += middle_order(root.right_child)return middle_order_tmp# 非递归中序遍历
def middle_order_not_recursion(root):if not isinstance(root, Node):return Nonestack = [root.right_child, root.value, root.left_child]result = []while stack:node = stack.pop(-1)if node:if isinstance(node, Node):stack.append(node.left_child)stack.append(node.value)stack.append(node.right_child)else:result.append(node)return result# 递归后续遍历
def post_order(root):if not isinstance(root, Node):return []post_order_tmp=[]if root is not None:post_order_tmp += pre_order(root.left_child)post_order_tmp += pre_order(root.right_child)post_order_tmp.append(root.value)return post_order_tmp# 非递归后续遍历
def post_order_recursion(root):if not isinstance(root, Node):return Nonestack = [root.value, root.right_child, root.left_child]result = []while stack:node = stack.pop(-1)if node:if isinstance(node, Node):result.append(node.value)stack.append(node.right_child)stack.append(node.left_child)else:result.append(node)return result# 分层遍历
def layer_order(root):if not isinstance(root, Node):return []queue = [root.value, root.left_child, root.right_child]result = []while queue:tmp = queue.pop(0)if tmp:if isinstance(tmp, Node):queue.append(tmp.value)queue.append(tmp.left_child)queue.append(tmp.right_child)else:result.append(tmp)return result

二叉树的其他方法:

# 递归方式计算节点个数
def node_count(root):if not isinstance(root, Node):return Noneelse:if root:return node_count(root.left_child)+node_count(root.right_child)+1else:return None# 借用分层遍历实现
def node_count_not_recursion(root):if not isinstance(root, Node):return Nonereturn len(layer_order(root))# 计算二叉树深度
def tree_deep(root):if not isinstance(root, Node):return Noneif root:return 1+max(tree_deep(root.left_child), max(root.right_child))else:return 0# 非递归方式实现
def tree_deep_not_recursion(root):if not isinstance(root, Node):return Nonestack = [(root, 1)]result = 0while stack:tmp_node, tmp_layer = stack.pop(0)if tmp_node:stack.append((tmp_node.left_child, tmp_layer+1))stack.append((tmp_node.ritht_child, tmp_layer+1))result = tmp_layer+1return result# 计算第K层节点的个数
def kth_node_count(root, k):if not isinstance(root, Node):return Noneif not root or k <=0:return 0if k == 1:return 1return kth_node_count(root.left_child, k-1)+kth_node_count(root.right_child, k-1)# 计算二叉树叶子节点的个数
def leaf_account(root):if not isinstance(root, Node):return Noneif not root:return 0if not root.left_child and not root.right_child:return 1return leaf_account(root.left_child)+leaf_account(root.right_child)# 判断是否为二分查找树BST
# 判断是否为二分查找树BST,递归方式
# 二分查找树的定义搞清楚,二分查找树的中序遍历结果为递增序列
def is_bst_tree(root):if not isinstance(root, Node):return []def is_asc(order):for i in range(len(order)-1):if order[i] > order[i+1]:return Falsereturn Truereturn is_asc(middle_order_not_recursion(root))if __name__ == '__main__':tree = Tree(1)tree1 = Tree(1)node7 = Node(5, None,None)node6 = Node(4, None,None)node5 = Node(3, None,None)node4 = Node(2, None,None)node3 = Node(1, None,None)node2 = Node(3, node5, node6)node1 = Node(4, node3, node4)tree.root.left_child = node1tree.root.right_child = node2tree1.root.left_child = node2tree1.root.right_child = node2print (post_order_recursion(tree.root))print(is_bst_tree(tree.root))print(is_bst_tree(tree1.root))

转载于:https://www.cnblogs.com/tashanzhishi/p/10448425.html

Python 数据结构 树相关推荐

  1. python数据结构树和二叉树,python数据结构树和二叉树简介

    一.树的定义 树形结构是一类重要的非线性结构.树形结构是结点之间有分支,并具有层次关系的结构.它非常类似于自然界中的树. 树的递归定义: 树(Tree)是n(n≥0)个结点的有限集T,T为空时称为空树 ...

  2. python数据结构 树_python 数据结构四 之 二叉树和树

    python数据结构教程第四课 树形结构是复杂结构中最简单的一类,这是一类非常重要的结构,在实际中使用广泛,反映了许多计算过程的抽象结构 一.简介 1.树 2.二叉树 二.二叉树和树的抽象数据类型(A ...

  3. python数据结构 树_python数据结构之二叉树的建立实例

    先建立二叉树节点,有一个data数据域,left,right 两个指针域 复制代码 代码如下: # -*- coding: utf - 8 - *- class TreeNode(object): d ...

  4. python数据结构-树

    树 树是数据元素之间具有层次关系的非线性结构,由n个节点构成的有限集合,节点数为0的树叫空树 树: 有且仅有一个被称为根的节点 其余节点可分为m个互不相交的有限集合,每个集合又构成一棵树,叫做根节点的 ...

  5. python数据结构 树_python数据结构之二叉树的统计与转换实例

    一.获取二叉树的深度 就是二叉树最后的层次,如下图: 实现代码: 代码如下: def getheight(self): "' 获取二叉树深度 "' return self.__ge ...

  6. python数据结构 树_Python数据结构——AVL树的实现

    既然,我们已经证明,保持 AVL 树的平衡将会使性能得到很大的提升,那我们看看如何在程序中向树插入一个新的键值.因为所有的新键是作为叶节点插入树的,而新叶子的平衡因子为零,所以我们对新插入的节点不作调 ...

  7. python 数据结构 树 dev get items_python数据结构之树(二叉树的遍历)

    '''树的构造 1.递归实现先序遍历.中序遍历.后序遍历 2.堆栈实现先序遍历.中序遍历.后序遍历 3.队列实现层次遍历''' #节点类 classNode(object):__slots__ = ' ...

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

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

  9. python tree结构_Python入门篇-数据结构树(tree)篇

    Python入门篇-数据结构树(tree)篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.树概述 1>.树的概念 非线性结构,每个元素可以有多个前躯和后继 树是n(n& ...

  10. python画树递归_用递归的方式绘制小树_Python数据结构实战(1):递归(算法面试)_Python视频-51CTO学院...

    购买本课程后,可以加51CTO学院李宁老师官方交流群:550369460注意,该群只允许购买李宁老师课程的学员进行技术交流,加群时需要提供在51CTO购买李宁老师课程的订单编号(任何一个课程的订单编号 ...

最新文章

  1. PHP的错误机制总结
  2. linux下source命令使用详解
  3. 非常实用的Python库
  4. 计算机教育调查报告,关于计算机类的教育实习调查报告
  5. java读取中文_java读写中文文件
  6. xlsxwriter写入Excel
  7. Java 实现数字全排列
  8. aac格式怎么转换为MP3格式
  9. Android平台版本-API级别与版本号对照表,移动开发技术导论答案
  10. Python爱心表白,快去发给你心仪的人叭~
  11. 2021年上海市安全员C证考试报名及上海市安全员C证找解析
  12. 根据电话号码获取联系人姓名
  13. 哆啦A梦的超级计算机,哆啦A梦的体内究竟有什么?其实你真的低估了这个蓝胖子...
  14. SDUT 2879 Colorful Cupcakes (2014年山东省第五届ACM大学生程序设计竞赛)
  15. react native Android 键盘将底部导航栏/按钮顶起
  16. shader流光+自发光
  17. Immervision面向智能手机推出具有最高分辨率的新型超广角125° FoV 全景镜头
  18. 页面底部copyright部分制作过程中遇到的问题,解决以及总结
  19. VGA显示彩条和图片(FPGA)
  20. 高阶自动驾驶量产之战,小鹏汽车NGP究竟有何优势?

热门文章

  1. Oracle 权限管理
  2. dubbo服务压力测试
  3. mysql one database_MYSQL学习笔记one
  4. Redis 持久化 RDB 详解
  5. python生成热度图_python根据输入的数据在地图上生成热力图效果
  6. 单片机之串行通信接口遇到的问题
  7. [渝粤教育] 广东-国家-开放大学 21秋期末考试国际私法10216k1
  8. yolov5的wts权重转成tensorrt的engine权重一定要注意的问题:版本匹配(有什么问题可以私信我)
  9. python将txt文档中的内容按字母顺序进行排序,并存入txt中
  10. 推荐系统之协同过滤(CF)算法详解和实现