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实现bitmap数据结构详解
Feb 17 Python
python实现的登陆Discuz!论坛通用代码分享
Jul 11 Python
python多线程编程中的join函数使用心得
Sep 02 Python
基于python的Tkinter编写登陆注册界面
Jun 30 Python
python3+PyQt5泛型委托详解
Apr 24 Python
python使用selenium实现批量文件下载
Mar 11 Python
python统计字符的个数代码实例
Feb 07 Python
Python3操作读写CSV文件使用包过程解析
Apr 10 Python
python如何查看安装了的模块
Jun 23 Python
5分钟快速掌握Python定时任务框架的实现
Jan 26 Python
详解Python魔法方法之描述符类
May 26 Python
Python OpenCV超详细讲解基本功能
Apr 02 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 ss7.5的数据调用 (笔记)
2010/03/08 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
浅析PHP文件下载原理
2014/12/25 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
php中动态调用函数的方法
2015/03/16 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
php文件上传的两种实现方法
2016/04/04 PHP
Laravel框架中集成MongoDB和使用详解
2019/10/17 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
理解AngularJs指令
2015/12/10 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
2016/06/26 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
2016/07/06 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
2017/01/10 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
JS表单数据验证的正则表达式(常用)
2017/02/18 Javascript
php 修改密码实现代码
2017/05/24 Javascript
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
AngularJS中controller控制器继承的使用方法
2017/11/03 Javascript
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
微信公众号平台接口开发 获取access_token过程解析
2019/08/14 Javascript
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
flask中使用蓝图将路由分开写在不同文件实例解析
2018/01/19 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
2020/07/21 Python
python dict如何定义
2020/09/02 Python
Viking比利时:购买办公用品
2019/10/30 全球购物
有多年工作经验的自我评价
2014/03/02 职场文书
学校党支部公开承诺书
2015/04/30 职场文书
Go语言空白表示符_的实例用法
2021/07/04 Golang
vue整合百度地图显示指定地点信息
2022/04/06 Vue.js