【数据结构】二叉树的python实现

本博文描述的二叉树是任意二叉树,可以使完全二叉树,也可以是非完全二叉树。
首先声明一个二叉树节点的初始化类TNode,每一个节点都有三个组成部分,节点的元素值,节点的左子树地址和节点的右子树地址。

class TNode(object):#初始化二叉树的节点,self.val是节点的数值,self.left是节点左子树的地址,self.right是右子树的地址。def __init__(self,val):self.val = valself.left = Noneself.right = None

然后定义二叉树的类CBT,其中包括二叉树根节点的初始化函数__init__,添加新节点到二叉树中的函数add,计算二叉树深度的函数getDepth,判断二叉树是否为空的函数isEmpty,采用递归方法层序遍历二叉树的函数floor_travel,采用递归方法先序遍历二叉树的函数front_travel,采用递归方法层中序历二叉树的函数middle_travel和采用递归方法后序遍历二叉树的函数back_travel。

class CBT(object):#初始化根节点def __init__(self):self.root = None#将新的节点添加到二叉树中def add(self,data):'''将data加入到完全二叉树作为一个节点'''node = TNode(data)#如果二叉树为空,将节点作为根节点if self.isEmpty():self.root = node#否则按照左右顺序添加节点,将节点作为二叉树的一个节点else:my_queue = []my_queue.append(self.root)while my_queue:cur_node = my_queue.pop(0)#如果当前节点为空节点,直接跳过if cur_node.val is None:continueif cur_node.left == None:cur_node.left = nodereturnelif cur_node.right == None:cur_node.right = nodereturnelse:my_queue.append(cur_node.left)my_queue.append(cur_node.right)#获得二叉树的深度def getDepth(self):#如果二叉树为空,深度为0if self.isEmpty():return 0else:            def deep(cur_node):left_depth = 0right_depth = 0if cur_node.left != None:left_depth += deep(cur_node.left)if cur_node.right != None:right_depth += deep(cur_node.right)return max(left_depth,right_depth) + 1 #左子树深度和右子树深度最大值+1depth = deep(self.root)return depth#判断二叉树是否为空    def isEmpty(self):if self.root == None:print('完全二叉树为空')return Trueelse:return False#层次遍历def floor_travel(self):#如果二叉树为空,返回空列表if self.isEmpty():return []else:my_stack = []my_queue = []my_queue.append(self.root)while my_queue:cur_node = my_queue.pop(0)my_stack.append(cur_node.val)if cur_node.left:my_queue.append(cur_node.left)if cur_node.right:my_queue.append(cur_node.right)return my_stack#递归先序遍历def front_travel(self):#如果二叉树为空,返回空列表if self.isEmpty():return []else:def loop(cur_node):tmp = []if cur_node:tmp.append(cur_node.val)tmp += loop(cur_node.left)tmp += loop(cur_node.right)return tmpvalue_list = loop(self.root)return value_list#递归中序遍历def middle_travel(self):#如果二叉树为空,返回空列表if self.isEmpty():return []else:def loop(cur_node):tmp = []if cur_node:tmp += loop(cur_node.left)tmp.append(cur_node.val)tmp += loop(cur_node.right)return tmpvalue_list = loop(self.root)return value_list#递归后序遍历def back_travel(self):#如果二叉树为空,返回空列表if self.isEmpty():return []else:def loop(cur_node):tmp = []if cur_node:tmp += loop(cur_node.left)tmp += loop(cur_node.right)tmp.append(cur_node.val)return tmpvalue_list = loop(self.root)return value_listif __name__ == '__main__':cbt = CBT()cbt.add(1)cbt.add(None)cbt.add(1)cbt.add(2)cbt.add(4)cbt.add(5)print(cbt.getDepth())print(cbt.front_travel())print(cbt.middle_travel())print(cbt.back_travel())

【数据结构】二叉树的python实现相关推荐

  1. 《数据结构与算法 Python语言描述》 读书笔记

    已经发布博客 <数据结构与算法 Python语言描述> 读书笔记 第二章 抽象数据类型和Python类 2.1 抽象数据类型abstract data type:ADT 2.1.1 使用编 ...

  2. 《数据结构与算法 Python语言实现》书评与学习心得

    做为Python小白,本人几个月前读完了Mark Lutz的1400页巨著<Learning Python>(太TM啰嗦了,读过的请举手),本打算继续学习下一步<Programmin ...

  3. 数据结构与算法python版 MOOC 第九周

    九.树及算法-上 本系列博客基于" (北京大学)数据结构与算法python版"慕课,课程在中国大学慕课和bilibili上均可找到. 1. 内容 树结构的相关术语 树的表示方法:嵌 ...

  4. 数据结构 -- 二叉树

          这篇文章介绍的是经典的数据结构--二叉树,在这篇文章里介绍了几乎二叉树的所有操作.       二叉树给我们最重要的印象莫过于递归,因为这棵树就是递归的,所以,我在解决各个问题时大部分都用 ...

  5. 数据结构 - 二叉树 - 面试中常见的二叉树算法题

    数据结构 - 二叉树 - 面试中常见的二叉树算法题 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图 ...

  6. mooc数据结构与算法python版期末考试_数据结构与算法Python版-中国大学mooc-试题题目及答案...

    数据结构与算法Python版-中国大学mooc-试题题目及答案 更多相关问题 婴儿出生一两天后就有笑的反应,这种笑的反应属于(). [判断题]填制原始凭证,汉字大写金额数字一律用正楷或草书书写,汉字大 ...

  7. 数据结构——二叉树的递归算法

    二叉树的结构定义: typedef struct BiNode {TElemType data;struct BiNode *lchild;struct BiNode *rchild; }BiNode ...

  8. 数据结构——二叉树的层次遍历进阶

    之前的一个博客 数据结构--二叉树的层次遍历看完这个,可以简单实现下面的问题 问题: 1.计算二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值. 2.用按层次顺序遍历二叉树的方法, ...

  9. 数据结构----二叉树叶子结点到根节点的高度计算

    数据结构----二叉树叶子结点到根节点的高度计算 代码: #include<stdio.h> #include<stdlib.h> typedef struct bstTree ...

最新文章

  1. git 从远程主服务器当中创建新分支
  2. php 编译mcrypt,centos 6下编译安装php时安装mcrypt支持库
  3. GitHub 报告显示香港码农大爆发,诚实的程序员:转行只因工资高!
  4. 半导体量子芯片开发获重要进展
  5. phpcms分页查询
  6. 留言本的漏洞挖掘总结
  7. Ubuntu用户与用户组
  8. K8S Learning(4)——Namespace
  9. lambda语法_Java Lambda语法替代
  10. C#中使用NPIO实现导入导出Excel简单操作
  11. mysql数据库事务有几种特性_面试官:你能说说事务的几个特性是啥?有哪几种隔离级别?...
  12. Mysql优化-大数据量下的分页策略
  13. linux实现标准设备输入输出,Linux的标准输入和输出
  14. 常用User-Agent大全 -《狗嗨默示录》-
  15. .net,微软,薪资及其他
  16. DVWA(全级别通关教程详解)
  17. Fast Refresh 原理剖析
  18. matlab多重积分如何使用方法,MATLAB在《高等数学》中的应用_多重积分
  19. FFMPeg代码分析:AVCodecContext结构体
  20. 知识型IP与网红的区别

热门文章

  1. 【强烈推荐】蒋勋细说《红楼梦》
  2. Q114:阅读PBRT-V3官方源代码的正确姿势
  3. 问题五十四:怎么用ray tracing画参数方程表示的曲面(2)—— bezier surface
  4. 学计算机的博士男朋友,有个计算机博士男朋友的日常?
  5. 物联网大数据平台有哪些功能特点
  6. Danfo.js专题 - Danfo.js与Dnotebook简介与入门
  7. wps html编辑表格,手机wps中怎么编辑表格图文教程
  8. 分离圆环图显示百分比_excel这个百分比图,你不一定会制作
  9. docker logstash_Mysql 同步数据到 Elasticserach(使用logstash-input-jdbc)
  10. numpy将所有数据变为0和1_PyTorch 学习笔记(二):张量、变量、数据集的读取、模组、优化、模型的保存和加载...