如何在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通过pil为png图片填充上背景颜色的方法
Mar 17 Python
Python中使用strip()方法删除字符串中空格的教程
May 20 Python
在Django的模板中使用认证数据的方法
Jul 23 Python
python安装mysql-python简明笔记(ubuntu环境)
Jun 25 Python
Python中应该使用%还是format来格式化字符串
Sep 25 Python
python实现对任意大小图片均匀切割的示例
Dec 05 Python
Pyinstaller 打包exe教程及问题解决
Aug 16 Python
python 使用递归回溯完美解决八皇后的问题
Feb 26 Python
python str字符串转uuid实例
Mar 03 Python
Python判断字符串是否为空和null方法实例
Apr 26 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
Jan 08 Python
Appium+Python实现简单的自动化登录测试的实现
Jan 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
Zerg建筑一览
2020/03/14 星际争霸
PHP 抓取新浪读书频道的小说并生成txt电子书的代码
2009/12/18 PHP
PHP中substr()与explode()函数用法分析
2014/11/24 PHP
php使用cookie实现记住登录状态
2015/04/27 PHP
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
JS 的应用开发初探(mootools)
2009/12/19 Javascript
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
JavaScript 注册事件代码
2011/01/27 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
js闭包用法实例详解
2016/12/13 Javascript
JavaScript实现的XML与JSON互转功能详解
2017/02/16 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
vue如何通过id从列表页跳转到对应的详情页
2018/05/01 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
详解小程序BackgroundAudioManager踩坑之旅
2019/12/08 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
使用Python中的tkinter模块作图的方法
2017/02/07 Python
Django添加sitemap的方法示例
2018/08/06 Python
树莓派采用socket方式文件传输(python)
2019/06/22 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
python pillow模块使用方法详解
2019/08/30 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
2020/01/03 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
python3爬取torrent种子链接实例
2020/01/16 Python
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
在加拿大在线租赁和购买电子游戏:Game Access
2019/09/02 全球购物
MVC的各个部分都有那些技术来实现?如何实现?
2016/04/21 面试题
考试作弊被抓检讨书
2014/01/10 职场文书
2016公司新年问候语
2015/11/11 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书
Python数据分析入门之数据读取与存储
2021/05/13 Python
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS