如何在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多线程ctrl+c退出问题解决方案
Oct 23 Python
初步认识Python中的列表与位运算符
Oct 12 Python
Python 判断是否为质数或素数的实例
Oct 30 Python
基于python requests库中的代理实例讲解
May 07 Python
Python将8位的图片转为24位的图片实现方法
Oct 24 Python
new_zeros() pytorch版本的转换方式
Feb 18 Python
PyQt5-QDateEdit的简单使用操作
Jul 12 Python
Python request中文乱码问题解决方案
Sep 17 Python
python des,aes,rsa加解密的实现
Jan 16 Python
Python+uiautomator2实现自动刷抖音视频功能
Apr 29 Python
python 定义函数 返回值只取其中一个的实现
May 21 Python
68行Python代码实现带难度升级的贪吃蛇
Jan 18 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中使用Oracle数据库(6)
2006/10/09 PHP
PHP遍历数组的几种方法
2012/03/22 PHP
phpnow php探针环境检测代码
2014/11/04 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
PHP实现通过URL提取根域名
2016/03/31 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
Lumen timezone 时区设置方法(慢了8个小时)
2018/01/20 PHP
CI框架(CodeIgniter)操作redis的方法详解
2018/01/25 PHP
Laravel框架控制器的middleware中间件用法分析
2019/09/30 PHP
javascript第一课
2007/02/27 Javascript
深入理解JavaScript编程中的同步与异步机制
2015/06/24 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
2015/06/25 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
2017/10/08 Javascript
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
详解django三种文件下载方式
2018/04/06 Python
python微信撤回监测代码
2019/04/29 Python
python使用sklearn实现决策树的方法示例
2019/09/12 Python
Python 装饰器原理、定义与用法详解
2019/12/07 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
Flask中jinja2的继承实现方法及实例
2021/03/03 Python
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
Ann Taylor官方网站:美国最大的女性产品制造商之一
2016/09/14 全球购物
财政局长自荐信范文
2013/12/22 职场文书
安全生产活动月方案
2014/03/09 职场文书
党的群众路线教育实践活动对照检查材料
2014/09/22 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
工作失职自我检讨书
2015/05/05 职场文书
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书
教师理论学习心得体会
2016/01/21 职场文书
MySQL主从复制断开的常用修复方法
2021/04/07 MySQL
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android