如何在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 socket网络编程步骤详解(socket套接字使用)
Dec 06 Python
Python入门篇之编程习惯与特点
Oct 17 Python
Python 迭代器与生成器实例详解
May 18 Python
浅谈python jieba分词模块的基本用法
Nov 09 Python
python turtle库画一个方格和圆实例
Jun 27 Python
使用pyecharts生成Echarts网页的实例
Aug 12 Python
Python实现打印实心和空心菱形
Nov 23 Python
深入浅析python 中的self和cls的区别
Jun 20 Python
python从Oracle读取数据生成图表
Oct 14 Python
python3处理word文档实例分析
Dec 01 Python
Python进度条的使用
May 17 Python
python pygame 开发五子棋双人对弈
May 02 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加密解密函数Authcode()修复版代码
2015/04/05 PHP
jquery 图片截取工具jquery.imagecropper.js
2010/04/09 Javascript
jQuery源码解读之removeAttr()方法分析
2015/02/20 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
jqueryMobile使用示例分享
2016/01/12 Javascript
Bootstrap弹出框(modal)垂直居中的问题及解决方案详解
2016/06/12 Javascript
javascript匀速动画和缓冲动画详解
2016/10/20 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
bootstrap中模态框、模态框的属性实例详解
2017/02/17 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
写了个监控nginx进程的Python脚本
2012/05/10 Python
python 字符串split的用法分享
2013/03/23 Python
Python迭代和迭代器详解
2016/11/10 Python
Python字符串处理实例详解
2017/05/18 Python
JavaScript实现一维数组转化为二维数组
2018/04/17 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
python之拟合的实现
2019/07/19 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
2020/01/02 Python
使用TFRecord存取多个数据案例
2020/02/17 Python
利用Python将图片中扭曲矩形的复原
2020/09/07 Python
韩国保养品、日本药妆购物网:小三美日
2018/12/30 全球购物
正宗的日本零食和糖果订阅盒:Bokksu
2019/11/21 全球购物
英国排名第一的宠物店:PetPlanet
2020/02/02 全球购物
如何启动时不需输入用户名与密码
2014/05/09 面试题
聚网科技C++面试笔试题
2015/09/01 面试题
教师业务学习制度
2014/01/25 职场文书
银行服务明星推荐材料
2014/05/29 职场文书
2014年教学工作总结
2014/11/13 职场文书
如何计划开一家便利店?
2019/07/31 职场文书
使用 JavaScript 制作页面效果
2021/04/21 Javascript
SQL写法--行行比较
2021/08/23 SQL Server