如何在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批量重命名同一文件夹下文件的方法
May 25 Python
实例讲解Python中global语句下全局变量的值的修改
Jun 16 Python
python实现图像识别功能
Jan 29 Python
Python-OpenCV基本操作方法详解
Apr 02 Python
TensorFlow实现非线性支持向量机的实现方法
Apr 28 Python
python中的for循环
Sep 28 Python
Python第三方Window模块文件的几种安装方法
Nov 22 Python
python实现统计代码行数的小工具
Sep 19 Python
DJango的创建和使用详解(默认数据库sqlite3)
Nov 18 Python
python垃圾回收机制(GC)原理解析
Dec 30 Python
Python函数式编程实例详解
Jan 17 Python
Matplotlib 折线图plot()所有用法详解
Jul 28 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
php&java(三)
2006/10/09 PHP
PHP+Mysql+jQuery实现动态展示信息
2011/10/08 PHP
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
2015/07/04 PHP
再推荐十款免费的php开发工具
2015/11/09 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
PHP实现的文件上传类与用法详解
2017/07/05 PHP
javascript 控制弹出窗口
2007/04/10 Javascript
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
IE6下javasc#ipt:void(0) 无效的解决方法
2013/12/23 Javascript
jQuery插件实现多级联动菜单效果
2015/12/01 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
详解angular中如何监控dom渲染完毕
2017/01/03 Javascript
JavaScript获取中英文混合字符串长度的方法示例
2017/02/04 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
原生JS实现网页手机音乐播放器 歌词同步播放的示例
2018/02/02 Javascript
Vue 使用中的小技巧
2018/04/26 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
JS面向对象之多选框实现
2020/01/17 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
[03:18]DOTA2亚洲邀请赛小组赛第一日 RECAP赛事回顾
2015/01/30 DOTA
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
Python中的多行注释文档编写风格汇总
2016/06/16 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
2019/09/16 Python
解决django model修改添加字段报错的问题
2019/11/18 Python
python 基于opencv操作摄像头
2020/12/24 Python
让IE6支持css3,让 IE7、IE8 都支持CSS3
2011/10/09 HTML / CSS
HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)
2016/12/14 HTML / CSS
公司授权委托书
2014/04/04 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书