数据结构与算法:树与二叉树python实现
最近复习一遍数据结构与算法,做一些笔记,大家可以一起复习。
一、树的一些容易混淆的定义:
结点层:根结点的层定义为1;根的孩子为第二层结点,依此类推;
树的深度(或高度):树中最大的结点层;
满二叉树:这个定义国内和国外有较大的区别:
国内教程定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。如图1:
图1
国外(国际)定义:a binary tree T is full if each node is either a leaf or possesses exactly two childnodes.
大意为:如果一棵二叉树的结点要么是叶子结点,要么它有两个子结点,这样的树就是满二叉树。(一棵满二叉树的每一个结点要么是叶子结点,要么它有两个子结点,但是反过来不成立,因为完全二叉树也满足这个要求,但不是满二叉树),如图2:
图2
满二叉树的任意节点,要么度为0,要么度为2.换个说法即要么为叶子结点,要么同时具有左右孩子。霍夫曼树是符合这种定义的,满足国际上定义的满二叉树,但是不满足国内的定义。
完全二叉树:若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
完美二叉树(可能国外才有):当所有的叶子节点都在同一层就是完美二叉树,毫无间隙填充了 h 层。对应国内满二叉树。
二、树数据结构python实现
我们将定义一个具有根值属性的类,以及左和右子树, 这个表示更接近于面向对象的编程范例。
属性:根、左右子树
方法:设置根、左右子树,获取根和左右子树
#定义二叉树类
class BinaryTree(object):def __init__(self, root, left = None, right = None):self.root = rootself.left = leftself.right = rightdef getRoot(self):return self.rootdef setRoot(self, root):self.root = rootdef getLeft(self):return self.leftdef getRight(self):return self.right#向树中添加左子树def insertLeft(self, newNode):if self.left == None:self.left = BinaryTree(newNode)else: #左子树具有节点,放到下一层t = BinaryTree(newNode)t.left = self.leftself.left = t #向树中添加右子树def insertRight(self, newNode):if self.right == None:self.right = BinaryTree(newNode)else:t = BinaryTree(newNode)t.right = self.rightself.right = t
三、二叉树的遍历
不知道你有没有发现,二叉树其实是一种递归结构,因为单独拿出来一个 subtree 子树出来,其实它还是一棵树。那遍历它就很方便啦,我们可以直接用递归的方式来遍历它。但是当处理顺序不同的时候,树又分为三种遍历方式:
- 先(根)序遍历: 先处理根,之后是左子树,然后是右子树
- 中(根)序遍历: 先处理左子树,之后是根,最后是右子树
- 后(根)序遍历: 先处理左子树,之后是右子树,最后是根
设置在类中的方法:
#遍历树def preorder(self):print(self.root)if self.left:self.left.preorder()if self.right:self.right.preorder()
外部函数的方法:
#前序遍历树的外部函数
def preorder(tree):if tree:print(tree.getRoot())preorder(tree.getLeft())preorder(tree.getRight())
#后序遍历树的外部函数
def postorder(tree):if tree:postorder(tree.getLeft())postorder(tree.getRight())print(tree.getRoot())
#中序遍历树的外部函数
def midorder(tree):if tree:midorder(tree.getLeft())print(tree.getRoot())midorder(tree.getRight())
以上哪种方式实现前序最好? 答案是在这种情况下,实现前序作为外部函数可能更好。原因是你很少只是想遍历树。在大多数情况下,将要使用其中一个基本的遍历模式来完成其他任务。 事实上,我们将在下面的例子中看到后序遍历模式与我们前面编写的用于计算分析树的代码非常接近。 因此,我们用外部函数实现其余的遍历。
补充:给点节点的前序序列和中序序列,可确定一棵二叉树。不同形态的二叉树的数目恰好是前序序列均为的二叉树所能得到的中序序列的数目。这个数目为,含有n个节点的不相似的二叉树的数目,二者相同。
github代码:https://github.com/makang101/python-data-structure
参考:
problem-solving-with-algorithms-and-data-structure-using-python 中文版
数据结构(C语言版)严蔚敏
数据结构与算法:树与二叉树python实现相关推荐
- Python__数据结构与算法——树、二叉树(实现先、中、后序遍历)
目录 一.树 二.二叉树 树和前面所讲的表.堆栈和队列等这些线性数据结构不同,树不是线性的.在处理较多数据时,使用线性结构较慢,而使用树结构则可以提高处理速度.不过,相对于线性的表.堆栈和队列等线性数 ...
- 数据结构与算法——树和二叉树***
第五章 :树和二叉树 树和图是两种重要的非线性结构.线性结构中结点具有唯一前驱和唯一后继的关系,而非线性结构中结点之间的关系不再具有这种唯一性.其中,树形结构中结点间的关系是前驱唯一而后继不唯一,即元 ...
- 数据结构与算法——树与二叉树详细分享
一.树 1.定义:由n个有限节点组成一个具有层次关系的集合,看起来像一颗倒挂的树,特点: 2.特点: a.每个节点有0个或多个子节点 b.没有父节点的节点称为根节点(A) c.每一个非根节点有且只有一 ...
- 数据结构与算法 | 树与二叉树
树的概念 二叉树的概念 树的概念和结构 树是一种非线性的数据结构,它是由n个有限结点组成一个具有层次关系的集合,把它叫做树是因为它看起来像一棵倒挂的树,如图所示 有一个特殊的结点,称为根节点,根节点没 ...
- 数据结构与算法:树 二叉树入门(一)
Tips: 采用java语言,关注博主,底部附有完整代码 工具:IDEA 本系列介绍的是数据结构: 树 这是第1篇目前计划一共有12篇: 二叉树入门 本篇 顺序二叉树 线索化二叉树 堆排序 赫夫曼树( ...
- 数据结构与算法--死磕二叉树
死磕二叉树 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫,因此有此次总结,以下是所有树 ...
- python遍历树结构_python 数据结构与算法——树的遍历
1.广度优先遍历 2.深度优先遍历 先序遍历:把根放在最前面 中序遍历:把根放在中间 后序遍历:把根放在后面 # -*- coding: utf-8 -*- """ Cr ...
- 【数据结构Note5】- 树和二叉树(知识点超细大全-涵盖常见算法 排序二叉树 线索二叉树 平衡二叉树 哈夫曼树)
文章目录 5.1 树和二叉树引入 5.1.1 树的概念 5.1.2 树的表示 5.1.3 树中基本术语 5.2 二叉树 5.2.1 概念 5.2.2 二叉树的性质 5.2.3 特殊的二叉树 5.2.4 ...
- 数据结构与算法基础(基于python)
用大O法表示运行时间,log都表示log2(以2为底的对数) 所有的算法都是基于python写的 一.二分查找法: 1.输入:一个有序的元素列表 2.输出:如果要查找的元素包含在列表中,二分查找返回其 ...
最新文章
- 请求拦截_实战SpringCloud通用请求字段拦截处理
- python模块下载过程出错_尝试导入已安装的python模块时收到错误
- c++文件操作一一读取文件内容
- CNDO-INTGRL-SS-AINTGS-斯莱特轨道指数
- 和县机电工程学校工业机器人_【校企合作】学校举行工业机器人教学系统捐赠仪式...
- 在启动HDFS时,针对集群中namenode无法识别datanode的问题的解决方法
- linux非阻塞通话编程,linux 非阻塞式socket编程求助。。
- HTML dfn元素
- MYSQL 取上一条记录,与下一条记录
- 363.矩形区域不超过K的最大数值和
- 可落地的云游戏解决方案
- 计算机复制方法有,如何在电脑上复制粘贴文字(包括快捷键),来学习吧
- 5个最优秀的Java和C#代码转换工具
- IPA (苹果应用程序文件格式)
- Matlab中的mod()函数
- 电子学:第010课——实验 9:时间与电容器
- java计算机毕业设计钢材出入库管理系统(附源码、数据库)
- 更改mtu 并没有立刻生效
- 《人工智能算法工程师(高级)》
- unpacking of archive failed: cpio: lstat failed - Not a directory
热门文章
- 主题:Centos6.4安装JDK
- w5100 网上资料整理
- 7-Zip CommondLine 使用记录
- ++ 优化 频繁new_Java性能优化的50个细节,我必须分享给你!
- JavaScript中的回调地狱及解决方法
- 清华尹成python爬虫百度云_爬虫:利用python完成百度贴吧数据采集
- mysql连接报错:The server time zone value ‘Öйú±ê׼ʱ¼ä‘ is unrecognized or represents more than one time
- AI: DL方法与问题空间探索
- 安卓JNI使用OpenCV
- 目标跟踪ObjectT综述介绍