如何在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用GET方法上传文件
Mar 10 Python
Python导入oracle数据的方法
Jul 10 Python
使用FastCGI部署Python的Django应用的教程
Jul 22 Python
Windows下Python2与Python3两个版本共存的方法详解
Feb 12 Python
Python针对给定列表中元素进行翻转操作的方法分析
Apr 27 Python
windows下安装Python的XlsxWriter模块方法
May 03 Python
Python获取网段内ping通IP的方法
Jan 31 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
Nov 19 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
Feb 23 Python
python网络编程:socketserver的基本使用方法实例分析
Apr 09 Python
python+selenium+chromedriver实现爬虫示例代码
Apr 10 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
Oct 19 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
一个连接两个不同MYSQL数据库的PHP程序
2006/10/09 PHP
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
2008/09/25 Javascript
html+css+js实现xp window界面及有关功能
2013/03/26 Javascript
jQuery cdn使用介绍
2013/05/08 Javascript
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
让元素在网页中可拖动示例代码
2013/08/13 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
2015/03/01 Javascript
详解JavaScript中的表单验证
2015/06/16 Javascript
JSONP原理及简单实现
2016/06/08 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
2017/08/04 Javascript
理解javascript async的用法
2017/08/22 Javascript
ajax请求data遇到的问题分析
2018/01/18 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
2018/08/27 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
vue中$refs, $emit, $on, $once, $off的使用详解
2019/05/26 Javascript
通过实例了解Nodejs模块系统及require机制
2020/07/16 NodeJs
Python中的类与对象之描述符详解
2015/03/27 Python
Python探索之创建二叉树
2017/10/25 Python
python学习之matplotlib绘制散点图实例
2017/12/09 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
Python函数式编程实例详解
2020/01/17 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
class类在python中获取金融数据的实例方法
2020/12/10 Python
Python爬虫开发与项目实战
2020/12/16 Python
html5中的一些标签学习(心得)
2016/10/18 HTML / CSS
NEW LOOK官网:英国时装零售巨头之一,快时尚品牌
2017/01/11 全球购物
日本最大级玩偶手办购物:あみあみ Amiami
2018/04/23 全球购物
世界上第一个创建了罩杯系统的美国内衣品牌:Maidenform
2019/03/23 全球购物
台湾三立电视电商平台:电电购
2019/09/09 全球购物
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
2012/02/04 面试题
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫
Python使用Web框架Flask开发项目
2022/06/01 Python