Python编程实现双链表,栈,队列及二叉树的方法示例


Posted in Python onNovember 01, 2017

本文实例讲述了Python编程实现双链表,栈,队列及二叉树的方法。分享给大家供大家参考,具体如下:

1.双链表

class Node(object):
  def __init__(self, value=None):
    self._prev = None
    self.data = value
    self._next = None
  def __str__(self):
    return "Node(%s)"%self.data
class DoubleLinkedList(object):
  def __init__(self):
    self._head = Node()
  def insert(self, value):
    element = Node(value)
    element._next = self._head
    self._head._prev = element
    self._head = element
  def search(self, value):
    if not self._head._next:
      raise ValueError("the linked list is empty")
    temp = self._head
    while temp.data != value:
      temp = temp._next
    return temp
  def delete(self, value):
    element = self.search(value)
    if not element:
      raise ValueError('delete error: the value not found')
    element._prev._next = element._next
    element._next._prev = element._prev
    return element.data
  def __str__(self):
    values = []
    temp = self._head
    while temp and temp.data:
      values.append(temp.data)
      temp = temp._next
    return "DoubleLinkedList(%s)"%values

2. 栈

class Stack(object):
  def __init__(self):
    self._top = 0
    self._stack = []
  def put(self, data):
    self._stack.insert(self._top, data)
    self._top += 1
  def pop(self):
    if self.isEmpty():
      raise ValueError('stack 为空')
    self._top -= 1
    data = self._stack[self._top]
    return data
  def isEmpty(self):
    if self._top == 0:
      return True
    else:
      return False
  def __str__(self):
    return "Stack(%s)"%self._stack

3.队列

class Queue(object):
  def __init__(self, max_size=float('inf')):
    self._max_size = max_size
    self._top = 0
    self._tail = 0
    self._queue = []
  def put(self, value):
    if self.isFull():
      raise ValueError("the queue is full")
    self._queue.insert(self._tail, value)
    self._tail += 1
  def pop(self):
    if self.isEmpty():
      raise ValueError("the queue is empty")
    data = self._queue.pop(self._top)
    self._top += 1
    return data
  def isEmpty(self):
    if self._top == self._tail:
      return True
    else:
      return False
  def isFull(self):
    if self._tail == self._max_size:
      return True
    else:
      return False
  def __str__(self):
    return "Queue(%s)"%self._queue

4. 二叉树(定义与遍历)

class Node:
  def __init__(self,item):
    self.item = item
    self.child1 = None
    self.child2 = None
class Tree:
  def __init__(self):
    self.root = None
  def add(self, item):
    node = Node(item)
    if self.root is None:
      self.root = node
    else:
      q = [self.root]
      while True:
        pop_node = q.pop(0)
        if pop_node.child1 is None:
          pop_node.child1 = node
          return
        elif pop_node.child2 is None:
          pop_node.child2 = node
          return
        else:
          q.append(pop_node.child1)
          q.append(pop_node.child2)
  def traverse(self): # 层次遍历
    if self.root is None:
      return None
    q = [self.root]
    res = [self.root.item]
    while q != []:
      pop_node = q.pop(0)
      if pop_node.child1 is not None:
        q.append(pop_node.child1)
        res.append(pop_node.child1.item)
      if pop_node.child2 is not None:
        q.append(pop_node.child2)
        res.append(pop_node.child2.item)
    return res
  def preorder(self,root): # 先序遍历
    if root is None:
      return []
    result = [root.item]
    left_item = self.preorder(root.child1)
    right_item = self.preorder(root.child2)
    return result + left_item + right_item
  def inorder(self,root): # 中序序遍历
    if root is None:
      return []
    result = [root.item]
    left_item = self.inorder(root.child1)
    right_item = self.inorder(root.child2)
    return left_item + result + right_item
  def postorder(self,root): # 后序遍历
    if root is None:
      return []
    result = [root.item]
    left_item = self.postorder(root.child1)
    right_item = self.postorder(root.child2)
    return left_item + right_item + result
t = Tree()
for i in range(10):
  t.add(i)
print('层序遍历:',t.traverse())
print('先序遍历:',t.preorder(t.root))
print('中序遍历:',t.inorder(t.root))
print('后序遍历:',t.postorder(t.root))

输出结果:

层次遍历: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
先次遍历: [0, 1, 3, 7, 8, 4, 9, 2, 5, 6]
中次遍历: [7, 3, 8, 1, 9, 4, 0, 5, 2, 6]
后次遍历: [7, 8, 3, 9, 4, 1, 5, 6, 2, 0]

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python根据经纬度计算距离示例
Feb 16 Python
python创建一个最简单http webserver服务器的方法
May 08 Python
python中的随机函数小结
Jan 27 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
代码详解django中数据库设置
Jan 28 Python
Python中文编码知识点
Feb 18 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
在python中利用pycharm自定义代码块教程(三步搞定)
Apr 15 Python
linux mint中搜狗输入法导致pycharm卡死的问题
Oct 28 Python
python包的导入方式总结
Mar 02 Python
使用python如何删除同一文件夹下相似的图片
May 07 Python
如何理解python接口自动化之logging日志模块
Jun 15 Python
Python栈算法的实现与简单应用示例
Nov 01 #Python
Python scikit-learn 做线性回归的示例代码
Nov 01 #Python
机器学习python实战之手写数字识别
Nov 01 #Python
Python定时器实例代码
Nov 01 #Python
机器学习python实战之决策树
Nov 01 #Python
详解Python开发中如何使用Hook技巧
Nov 01 #Python
python利用标准库如何获取本地IP示例详解
Nov 01 #Python
You might like
中篇:安装及配置PHP
2006/12/13 PHP
用PHP实现维护文件代码
2007/06/14 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
2010/09/10 PHP
使用php统计字符串中中英文字符的个数
2013/06/23 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
php源码的使用方法讲解
2019/09/26 PHP
sina的lightbox效果。
2007/01/09 Javascript
Javascript中eval函数的使用方法与示例
2007/04/09 Javascript
javascript innerHTML、outerHTML、innerText、outerText的区别
2008/11/24 Javascript
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
JavaScript 原型学习总结
2010/10/29 Javascript
Js 去掉字符串中的空格(实现代码)
2013/11/19 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
2015/07/29 Javascript
JavaScript中apply方法的应用技巧小结
2016/09/29 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
Bootstrap实现下拉菜单多级联动
2017/11/23 Javascript
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
js基于canvas实现时钟组件
2021/02/07 Javascript
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
python 统计代码行数简单实例
2017/05/04 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
2019/06/24 Python
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
canvas绘制图片drawImage使用方法
2020/09/15 HTML / CSS
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
.net面试题
2015/12/22 面试题
数据员岗位职责
2013/11/19 职场文书
基层党支部公开承诺书
2014/05/29 职场文书
小学教师师德师风演讲稿
2014/08/22 职场文书
房屋授权委托书范本
2014/10/07 职场文书
生日祝酒词大全
2015/08/10 职场文书
Win11查看设备管理器
2022/04/19 数码科技