二叉树设计

定义节点类

class Node:

# 修改初始化方法

def init(self,value):

self.value = value # 节点值

self.left = None # 左子树

self.right = None # 右子树

定二叉树类

class BinaryTree:

# 修改初始化方法

def init(self,root=None):

self.root = root # 根节点

# 定义添加节点方法 广度优先

def add(self,value):

if self.root == None:

self.root = Node(value)

return # 根节点已存在,不再添加

# 根节点不为空,开始遍历

queue= []

# 将根节点加入队列

queue.append(self.root)

# 循环判断,哪个节点为空,将新节点加入该节点

while True:

# 从队列中取出根节点

node = queue.pop(0)

# 判断该节点左子树是否为空

if node.left == None:

node.left = Node(value)

return

else:

queue.append(node.left)

# 判断该节点右子树是否为空

if node.right == None:

node.right = Node(value)

return

else:

queue.append(node.right)

# 遍历二叉树 广度优先

def traverse(self,root):

# 判断根节点是否为空,若为空,则返回

if self.root == None:

return

# 创建队列

queue = []

# 将根节点添加到队列中

queue.append(self.root)

# 循环遍历,根据队列长度来循环,需要大于0

while len(queue) > 0:

# 从队列中取出节点

node = queue.pop(0)

# 打印节点内容

print(node.value,end=' ')

# 判断左子树是否为空,若不为空,则添加到队列中

if node.left != None:

queue.append(node.left)

# 判断右子树是否为空,若不为空,则添加队列中

if node.right != None:

queue.append(node.right)

# 遍历二叉树,深度优先,先序遍历 (根左右)

def pre_traverse(self,root):

# 判断根节点是否为空,不为空则执行

if root is not None:

# 打印根节点

print(root.value,end=' ')

# 递归调用左子树

self.pre_traverse(root.left)

# 递归调用右子树

self.pre_traverse(root.right)

# 遍历二叉树,深度优先,中序遍历 (左根右)

def mid_traverse(self,root):

# 判断根节点是否为空,不为空则执行

if root is not None:

# 递归调用左子树

self.mid_traverse(root.left)

# 打印根节点

print(root.value,end=' ')

# 递归调用右子树

self.mid_traverse(root.right)

# 遍历二叉树,深度优先,后序遍历 (左右根)

def post_traverse(self,root):

# 判断根节点是否为空,不为空则执行

if root is not None:

# 递归调用左子树

self.post_traverse(root.left)

# 递归调用右子树

self.post_traverse(root.right)

# 打印根节点

print(root.value,end=' ')

测试

def Dm01():

# 创建二叉树

tree = BinaryTree()

# 添加节点

tree.add(0)

tree.add(1)

tree.add(2)

tree.add(3)

tree.add(4)

tree.add(5)

tree.add(6)

tree.add(7)

tree.add(8)

tree.add(9)

# 先序遍历

print("\n先序遍历:")

tree.pre_traverse(tree.root)

# 中序遍历

print("\n中序遍历:")

tree.mid_traverse(tree.root)

# 后序遍历

print("\n后序遍历:")

tree.post_traverse(tree.root)

运行测试

if name == 'main':

Dm01()1.

在python中实现二叉树的更多相关文章

  1. python实战--数据结构二叉树

    此文将讲述如何用python实战解决二叉树实验 前面已经讲述了python语言的基本用法,现在让我们实战一下具体明确python的用法 点击我进入python速成笔记 先看一下最终效果图: 首先我们要 ...

  2. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

  3. Python中的高级数据结构(转)

    add by zhj: Python中的高级数据结构 数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数 ...

  4. XGBoost中参数调整的完整指南(包含Python中的代码)

    (搬运)XGBoost中参数调整的完整指南(包含Python中的代码) AARSHAY JAIN, 2016年3月1日     介绍 如果事情不适合预测建模,请使用XGboost.XGBoost算法已 ...

  5. python数据结构之二叉树的统计与转换实例

    python数据结构之二叉树的统计与转换实例 这篇文章主要介绍了python数据结构之二叉树的统计与转换实例,例如统计二叉树的叶子.分支节点,以及二叉树的左右两树互换等,需要的朋友可以参考下 一.获取 ...

  6. [转]Python中的str与unicode处理方法

    早上被python的编码搞得抓耳挠腮,在搜资料的时候感觉这篇博文很不错,所以收藏在此. python2.x中处理中文,是一件头疼的事情.网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自 ...

  7. python中的Ellipsis

    ...在python中居然是个常量 print(...) # Ellipsis 看别人怎么装逼 https://www.keakon.net/2014/12/05/Python%E8%A3%85%E9 ...

  8. python中的默认参数

    https://eastlakeside.gitbooks.io/interpy-zh/content/Mutation/ 看下面的代码 def add_to(num, target=[]): tar ...

  9. Python中的类、对象、继承

    类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...

  10. python中的TypeError错误解决办法

    新手在学习python时候,会遇到很多的坑,下面来具体说说其中一个. 在使用python编写面向对象的程序时,新手可能遇到TypeError: this constructor takes no ar ...

随机推荐

  1. magic book

    magic book.md body { font-family: var(--vscode-markdown-font-family, -apple-system, BlinkMacSystemFo ...

  2. [C++/QT] 获取进程完整路径

    气哭我了,我不就获取一下进程路径嘛,,,绕了好大一圈 主要是用到了GetModuleFileNameEx() 函数 食用方式如下 HANDLE hProcess = OpenProcess(PROCE ...

  3. Java 类的成员之四: 代码块(或初始化块)

    1 package com.bytezreo.block; 2 3 /** 4 * 5 * @Description 类的成员之四: 代码块(或初始化块) 6 * @author Bytezero·z ...

  4. Scriban语言手册中文版

    Scriban是一个快速.强大.安全且轻量级的模板引擎,同时兼容liquid语法规则. 项目地址:https://github.com/scriban/scriban 这个文档是语言语法的中文翻译 原 ...

  5. 从0开始搭建开发环境 -实现servlet原生开发

    开发环境:  JDK1.8 + Servlet + Mysql 搭建项目 项目搭建参考博客 https://www.cnblogs.com/oyww-2027/p/15347137.html File ...

  6. 摆脱鼠标系列 - Alt + N 快速切换vscode多个项目 - HotKeyP

    摆脱鼠标系列 - Alt + N 快速切换vscode多个项目 用的软件是 HotKeyP 打开软件选择vscode vscode里面的 project那个插件也很好,但是需要打开vscode以后,这 ...

  7. shell脚本中将 IFS (Internal Field Separator 内部字段分隔符)替换为换行符

    将 IFS 中的空白符(换行.制表符.空格)修改为仅包含换行 IFS 是shell中的内部变量,在使用 for var in var_list;do use $var do something don ...

  8. springboot+vue3+nuxt3+ts+minio开发的dsblog3.0前后端博客

    springboot+vue3+nuxt3+ts+minio开发的dsblog3.0前后端博客 转载自:www.javaman.cn 一.技术栈 本博客系统采用了先进且成熟的技术栈,包括Spring ...

  9. MyEclipse之各个版本的区别

    跟Eclipse一样,MyEclipse的各个版本也是有区别的,他们所集成的插件是不同的. 从插件数量和功能的强大程度上讲:Blue>Professional>Standard MyEcl ...

  10. 新浪Linux 运维工程师面试真题

    新浪Linux 运维工程师面试真题 首先我们来看下新浪 Linux 运维工程师招聘岗位要求: [岗位定义]运维工程师 [岗位薪资]10K-20K [基本要求]经验 1-3 年 / 本科及以上 / 全职 ...