如何在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实现的简单猜数字游戏
Apr 04 Python
python获取本机mac地址和ip地址的方法
Apr 29 Python
Python中在脚本中引用其他文件函数的实现方法
Jun 23 Python
详解Python中的相对导入和绝对导入
Jan 06 Python
python编程通过蒙特卡洛法计算定积分详解
Dec 13 Python
解析Python中的eval()、exec()及其相关函数
Dec 20 Python
对Python中DataFrame按照行遍历的方法
Apr 08 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
Python实现注册、登录小程序功能
Sep 21 Python
浅谈django channels 路由误导
May 28 Python
Python 内存管理机制全面分析
Jan 16 Python
Python中else的三种使用场景
Jun 16 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
广播爱好者需要了解的天线知识
2021/03/01 无线电
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
ThinkPHP实现带验证码的文件上传功能实例
2014/11/01 PHP
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
php计算多维数组中所有值总和的方法
2015/06/24 PHP
php需登录的文件上传管理系统
2020/03/21 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
你必须知道的Javascript知识点之"深入理解作用域链"的介绍
2013/04/23 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
2014/02/26 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
原生js轮播(仿慕课网)
2017/02/15 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
jQuery插件artDialog.js使用与关闭方法示例
2017/10/09 jQuery
React-intl 实现多语言的示例代码
2017/11/03 Javascript
web前端vue之CSS过渡效果示例
2018/01/10 Javascript
JavaScript使用math.js进行精确计算操作示例
2018/06/19 Javascript
js字符串倒序的实例代码
2018/11/30 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
2019/02/10 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
python访问类中docstring注释的实现方法
2015/05/04 Python
在Django的模型中添加自定义方法的示例
2015/07/21 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
SQL里面如何插入自动增长序列号字段
2012/03/29 面试题
关于读书的演讲稿
2014/05/07 职场文书
2014年村支部书记四风对照检查材料思想汇报
2014/10/02 职场文书
体育委员竞选稿
2015/11/21 职场文书
《穷人》教学反思
2016/02/19 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
Python matplotlib可视化之绘制韦恩图
2022/02/24 Python
vue-cil之axios的二次封装与proxy反向代理使用说明
2022/04/07 Vue.js
vue实现列表垂直无缝滚动
2022/04/08 Vue.js
python井字棋游戏实现人机对战
2022/04/28 Python