如何在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中的rjust()方法使用详解
May 19 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
Aug 16 Python
详解Python中的正则表达式
Jul 08 Python
python并发编程多进程 互斥锁原理解析
Aug 20 Python
Python模块的定义,模块的导入,__name__用法实例分析
Jan 07 Python
使用Python实现牛顿法求极值
Feb 10 Python
Pandas读取csv时如何设置列名
Jun 02 Python
Python 删除List元素的三种方法remove、pop、del
Nov 16 Python
python爬虫scrapy图书分类实例讲解
Nov 23 Python
用python爬虫批量下载pdf的实现
Dec 01 Python
tensorflow2.0教程之Keras快速入门
Feb 20 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 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
最小化数据传输――在客户端存储数据
2006/10/09 PHP
解析php中反射的应用
2013/06/18 PHP
php实现zip文件解压操作
2015/11/03 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
js生成随机数之random函数随机示例
2013/12/20 Javascript
js语法学习之判断一个对象是否为数组
2014/05/13 Javascript
JavaScript动态添加style节点的方法
2015/06/09 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
javaScript中的空值和假值
2017/12/18 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
JavaScript中的类型检查
2020/02/03 Javascript
深入浅出分析Python装饰器用法
2017/07/28 Python
python决策树之C4.5算法详解
2017/12/20 Python
python版学生管理系统
2018/01/10 Python
python实现求最长回文子串长度
2018/01/22 Python
使用python爬虫获取黄金价格的核心代码
2018/06/13 Python
win7+Python3.5下scrapy的安装方法
2018/07/31 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
Django ORM多对多查询方法(自定义第三张表&ManyToManyField)
2019/08/09 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
美国儿童玩具、装扮和玩偶商店:Magic Cabin
2018/09/02 全球购物
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
中学劳技课教师的自我评价
2014/02/05 职场文书
高中物理教学反思
2014/02/08 职场文书
选秀节目策划方案
2014/06/06 职场文书
2015中秋节慰问信范文
2015/03/23 职场文书
2015年项目工作总结
2015/04/29 职场文书
python flask框架快速入门
2021/05/14 Python
Python机器学习应用之基于线性判别模型的分类篇详解
2022/01/18 Python