如何在Python中创建二叉树


Posted in Python onMarch 30, 2021

前言

本文的内容是数据结构中二叉树部分最基础的,之所以写一下主要是为了方便刷题的时候,能够在自己电脑上很快的使用这种小的demo进行复杂的练习。

二叉树节点定义

二叉树的节点定义如下:

class TreeNode():#二叉树节点
  def __init__(self,val,lchild=None,rchild=None):
    self.val=val		#二叉树的节点值
    self.lchild=lchild		#左孩子
    self.rchild=rchild		#右孩子

递归构建二叉树

本文使用的前序递归构建的方法(其余顺序读者自行变化,本文主要意在如何快速构建能够执行的二叉树)
例如,我们想构建一个如下图所示的树(其前序遍历结果为:abcde):

如何在Python中创建二叉树

这里我们需要使用到扩展的二叉树,也就是要告诉计算机什么是叶结点,什么是空节点,否侧无法分辨左右节点。例如先序遍历的顺序为"abcde",扩展的二叉树前序序列为:“abc##d##e##”,#代表此处节点为None,如下图:

如何在Python中创建二叉树

既然是使用递归的方法构建二叉树,主要需要理解递归的过程,这种思路将在之后的很多地方用的到。
要知道如何递归的构建二叉树,我们不能纠结于递归每一层到底干了什么,这样就会一直纠结下去(所有的递归问题都一样)。我们需要注意的是:

  1. 在我们的任务中,终止条件是什么?
  2. 在我们的任务中,本次递归要干嘛?
  3. 在我们的任务中,本次递归要返回给上一次递归的是啥?

在递归构建二叉树的任务中,我们要做到不纠结于每一层,而是只关注该层在做什么,这样,对于下图左侧的树,我们就可以看作为右侧的树,它只有自己a (a),左子树B (bcd)和右子树C (e)。

如何在Python中创建二叉树

这样我们需要注意的那三个问题的回答自然就有了(做递归问题,心中要想着怎么回答这三个问题):

  • 在我们的任务中,终止条件是什么?

[给我们的字符用完,也就不需要再创建节点了]

  • 在我们的任务中,本次递归要干嘛?

[本次递归要创建三个节点,一个根节点,一个左节点,一个右节点]

  • 在我们的任务中,本次递归要返回给上一次递归的是啥?

[当然是返回一个本层构造好的树的根节点]
理解了上述三个问题的回答,递归的代码自然可以写出:

def Creat_Tree(Root,val):
  if len(vals)==0:#终止条件:val用完了
    return Root
  if vals[0]!='#':#本层需要干的就是构建Root、Root.lchild、Root.rchild三个节点。
    Root = TreeNode(vals[0])
    vals.pop(0)
    Root.lchild = Creat_Tree(Root.lchild,val)
    Root.rchild = Creat_Tree(Root.rchild,val)
    return Root#本次递归要返回给上一次的本层构造好的树的根节点
  else:
    Root=None
    vals.pop(0)
    return Root#本次递归要返回给上一次的本层构造好的树的根节点

看懂了上述内容,构建一棵我们想象的二叉树就很简单了,只要输入一个我们心目中前序遍历扩展的二叉树序列即可:

if __name__ == '__main__':
  Root = None
  strs="abc##d##e##"#前序遍历扩展的二叉树序列
  vals = list(strs)
  Roots=Creat_Tree(Root,vals)#Roots就是我们要的二叉树的根节点。

以上就是如何在Python中创建二叉树的详细内容,更多关于Python创建二叉树的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python提取内容关键词的方法
Mar 16 Python
python简单实现基数排序算法
May 16 Python
python3实现暴力穷举博客园密码
Jun 19 Python
利用python实现xml与数据库读取转换的方法
Jun 17 Python
python实现神经网络感知器算法
Dec 20 Python
python安装pywin32clipboard的操作方法
Jan 24 Python
python+numpy按行求一个二维数组的最大值方法
Jul 09 Python
Python符号计算之实现函数极限的方法
Jul 15 Python
pandas 对group进行聚合的例子
Dec 27 Python
Java如何基于wsimport调用wcf接口
Jun 17 Python
怎么解决pycharm license Acti的方法
Oct 28 Python
pytorch 中forward 的用法与解释说明
Feb 26 Python
pycharm2021激活码使用教程(永久激活亲测可用)
python实现web邮箱扫描的示例(附源码)
python函数指定默认值的实例讲解
Mar 29 #Python
pytest进阶教程之fixture函数详解
python中pandas.read_csv()函数的深入讲解
Mar 29 #Python
python编写函数注意事项总结
Mar 29 #Python
python基于tkinter制作无损音乐下载工具
You might like
一个改进的UBB类
2006/10/09 PHP
mysql5写入和读出乱码解决
2006/11/25 PHP
在PHP中使用反射技术的架构插件使用说明
2010/05/18 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
实例讲解PHP表单验证功能
2019/02/15 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
超清晰的document对象详解
2007/02/27 Javascript
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
2012/12/28 Javascript
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
jQuery Migrate 1.1.0 Released 注意事项
2014/06/14 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
2016/12/27 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
2018/02/13 jQuery
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
JS实现的tab切换并显示相应内容模块功能示例
2019/08/03 Javascript
python单链表实现代码实例
2013/11/21 Python
Python入门教程之运算符与控制流
2016/08/17 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
Python中的四种交换数值的方法解析
2019/11/18 Python
如何在django中实现分页功能
2020/04/22 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
英国最大的独立摄影零售商:Park Cameras
2019/11/27 全球购物
物业工作计划书
2014/01/10 职场文书
《囚绿记》教学反思
2014/03/01 职场文书
前台文员职责范本
2014/03/07 职场文书
文体活动实施方案
2014/03/27 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
新文化运动的基本口号
2014/06/21 职场文书
我的中国梦主题教育活动总结
2015/05/07 职场文书
横空出世观后感
2015/06/09 职场文书
2019新员工试用期转正工作总结范文
2019/08/21 职场文书