如何在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编程中super关键字的用法
Jun 24 Python
用TensorFlow实现戴明回归算法的示例
May 02 Python
基于pip install django失败时的解决方法
Jun 12 Python
python redis 删除key脚本的实例
Feb 19 Python
python 进程 进程池 进程间通信实现解析
Aug 23 Python
TensorBoard 计算图的查看方式
Feb 15 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
Mar 12 Python
python支持多继承吗
Jun 19 Python
Python使用lambda抛出异常实现方法解析
Aug 20 Python
python 无损批量压缩图片(支持保留图片信息)的示例
Sep 22 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
Dec 03 Python
详解python 条件语句和while循环的实例代码
Dec 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 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
php中函数的形参与实参的问题说明
2010/09/01 PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
2013/11/07 PHP
通过实例解析PHP数据类型转换方法
2020/07/11 PHP
jquery学习笔记二 实现可编辑的表格
2010/04/09 Javascript
js获取height和width的方法说明
2013/01/06 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
jQuery移除元素自动解绑事件实现思路及代码
2014/05/31 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
JavaScript中指定函数名称的相关方法
2015/06/04 Javascript
jQuery实现的网页竖向菜单效果代码
2015/08/26 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
jQuery简单实现title提示效果示例
2016/08/01 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
简单了解前端渐进式框架VUE
2020/07/20 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
2020/12/14 Vue.js
[00:09]DOTA2新版本PA至宝特效动作展示
2014/11/19 DOTA
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
python计算方程式根的方法
2015/05/07 Python
python模拟Django框架实例
2016/05/17 Python
解读! Python在人工智能中的作用
2017/11/14 Python
Python使用PIL模块生成随机验证码
2017/11/21 Python
pandas去重复行并分类汇总的实现方法
2019/01/29 Python
详解python中的time和datetime的常用方法
2019/07/08 Python
python字符串判断密码强弱
2020/03/18 Python
python实现飞船游戏的纵向移动
2020/04/24 Python
python else语句在循环中的运用详解
2020/07/06 Python
Flask处理Web表单的实现方法
2021/01/31 Python
英国在线泳装店:Simply Swim
2019/05/05 全球购物
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
解释DataSet(ds) 和 ds as DataSet 的含义
2014/07/27 面试题
爱我中华教学反思
2014/04/28 职场文书
Python实现双向链表
2022/05/25 Python