如何在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 thread 并发且顺序运行示例
Apr 09 Python
Python代码的打包与发布详解
Jul 30 Python
Python版微信红包分配算法
May 04 Python
Pycharm学习教程(7)虚拟机VM的配置教程
May 04 Python
Python定时器实例代码
Nov 01 Python
python Pygame的具体使用讲解
Nov 03 Python
Python用户推荐系统曼哈顿算法实现完整代码
Dec 01 Python
详解K-means算法在Python中的实现
Dec 05 Python
Django学习教程之静态文件的调用详解
May 08 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
Jul 04 Python
Windows下Anaconda和PyCharm的安装与使用详解
Apr 23 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
Jan 27 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
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
2017/07/27 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
2019/03/22 PHP
QQ登录简单实现代码
2021/03/09 Javascript
使用javascipt---实现二分查找法
2013/04/10 Javascript
jquery获取子节点和父节点的示例代码
2013/09/10 Javascript
jquery 清空file域示例(兼容个浏览器)
2013/10/11 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
javascript日期格式化方法汇总
2015/10/04 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
Bootstrap3下拉菜单的实现
2017/02/22 Javascript
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
在Vue项目中引入腾讯验证码服务的教程
2018/04/03 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
详解JavaScript函数callee、call、apply的区别
2019/03/08 Javascript
AntV F2和vue-cli构建移动端可视化视图过程详解
2019/10/08 Javascript
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python插入排序算法实例分析
2015/07/03 Python
python文件操作相关知识点总结整理
2016/02/22 Python
基于Python函数的作用域规则和闭包(详解)
2017/11/29 Python
对dataframe进行列相加,行相加的实例
2018/06/08 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
Python数据处理篇之Sympy系列(五)---解方程
2019/10/12 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
2020/06/01 Python
从python读取sql的实例方法
2020/07/21 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
Shein英国:女性时尚网上商店
2019/04/10 全球购物
材料化学应届生求职信
2013/10/09 职场文书
法律专业推荐信范文
2013/11/29 职场文书
利用python调用摄像头的实例分析
2021/06/07 Python
python解析照片拍摄时间进行图片整理
2022/07/23 Python