如何在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实现通过文件路径获取文件hash值的方法
Apr 29 Python
浅谈Python 的枚举 Enum
Jun 12 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
Jun 26 Python
Python简单读写Xls格式文档的方法示例
Aug 17 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
Aug 31 Python
python并发爬虫实用工具tomorrow实用解析
Sep 25 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
多个python文件调用logging模块报错误
Feb 12 Python
如何用 Python 处理不平衡数据集
Jan 04 Python
python绘图模块之利用turtle画图
Feb 12 Python
单身狗福利?Python爬取某婚恋网征婚数据
Jun 03 Python
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
Jun 08 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
声音就能俘获人心,蕾姆,是哪个漂亮小姐姐配音呢?
2020/03/03 日漫
PHP完整的日历类(CLASS)
2006/11/27 PHP
php获取网页内容方法总结
2008/12/04 PHP
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
2012/05/30 Javascript
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
2016/09/24 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
Angular实现的table表格排序功能完整示例
2017/12/22 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
[05:06]DOTA2-DPC中国联赛 正赛 VG vs Magma选手采访
2021/03/11 DOTA
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
2014/06/18 Python
python线程中同步锁详解
2018/04/27 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
python递归法解决棋盘分割问题
2019/07/17 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
PyInstaller的安装和使用的详细步骤
2020/06/02 Python
html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
2013/01/09 HTML / CSS
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
伦敦眼门票在线预订:London Eye
2018/05/31 全球购物
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
办公设备采购方案
2014/03/16 职场文书
报告会主持词
2014/04/02 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
房屋租赁合同补充协议
2014/10/11 职场文书
2014矛盾纠纷排查调处工作总结
2014/12/09 职场文书
社区宣传标语口号
2015/12/26 职场文书
导游词之河北邯郸
2019/09/12 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang
Python学习之包与模块详解
2022/03/19 Python