如何在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实现的一个找零钱的小程序代码分享
Aug 25 Python
python统计一个文本中重复行数的方法
Nov 19 Python
python实现根据ip地址反向查找主机名称的方法
Apr 29 Python
Python OS模块常用函数说明
May 23 Python
详解python上传文件和字符到PHP服务器
Nov 24 Python
python线程池threadpool实现篇
Apr 27 Python
浅谈python中拼接路径os.path.join斜杠的问题
Oct 23 Python
对Python中list的倒序索引和切片实例讲解
Nov 15 Python
Python实现的银行系统模拟程序完整案例
Apr 12 Python
在Python中使用turtle绘制多个同心圆示例
Nov 23 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
Sep 23 Python
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
Oct 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
什么是短波收听SWL
2021/03/01 无线电
php 表单验证实现代码
2009/03/10 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
2014/07/08 PHP
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
php开发中的页面跳转方法总结
2015/04/26 PHP
php实现图片上传时添加文字和图片水印技巧
2020/04/18 PHP
Yii编程开发常见调用技巧集锦
2016/07/15 PHP
php验证码生成器
2017/05/24 PHP
如何让DIV可编辑、可拖动示例代码
2013/09/18 Javascript
eclipse如何忽略js文件报错(附图)
2013/10/30 Javascript
基于Vuejs实现购物车功能
2016/08/02 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
2016/08/08 Javascript
jquery-mobile表单的创建方法详解
2016/11/23 Javascript
Angular.js之作用域scope'@','=','&'实例详解
2017/02/28 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
2017/04/25 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
AngularJS service之select下拉菜单效果
2017/07/28 Javascript
jQuery选择器特殊字符与属性空格问题
2017/08/14 jQuery
vue实现模态框的通用写法推荐
2018/02/26 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
2018/03/12 Javascript
详解封装基础的angular4的request请求方法
2018/06/05 Javascript
详解如何使用webpack打包JS
2018/06/21 Javascript
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
2019/05/05 Javascript
[43:32]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
Python qqbot 实现qq机器人的示例代码
2019/07/11 Python
基于python实现音乐播放器代码实例
2020/07/01 Python
招聘单位介绍信
2014/01/14 职场文书
2014年公司植树节活动方案
2014/03/04 职场文书
2014年党员整改措施
2014/10/24 职场文书
2014教师年度工作总结
2014/11/10 职场文书
中秋节慰问信
2015/02/15 职场文书
导游词之徐州-云龙山
2019/09/29 职场文书
CSS极坐标的实例代码
2021/06/03 HTML / CSS