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

Python编程实现双链表,栈,队列及二叉树是数据结构中非常重要的内容。本文将详细介绍Python实现双链表、栈、队列及二叉树的方法示例。

双链表实现方法示例

定义节点类

首先,我们需要定义一个节点类,该类包含三个属性:

  1. data:表示节点值
  2. prev:表示前一个节点
  3. next:表示下一个节点
class Node:
    def __init__(self, data=None, prev=None, next=None):
        self.data = data
        self.prev = prev
        self.next = next

定义双链表类

使用节点类定义双链表类,该类包含以下几个方法:

  1. __init__:初始化链表
  2. append:在链表尾部追加一个节点
  3. prepend:在链表头部插入一个节点
  4. insert_after_node:在指定节点后插入一个节点
  5. insert_before_node:在指定节点前插入一个节点
  6. delete_node:删除指定节点
  7. print_forward:正序打印链表
  8. print_backward:反序打印链表
class DoublyLinkedList:
    def __init__(self):
        self.head = None

    def append(self, data):
        new_node = Node(data)
        if self.head is None:
            new_node.prev = None
            self.head = new_node
        else:
            current = self.head
            while current.next:
                current = current.next
            current.next = new_node
            new_node.prev = current
            new_node.next = None

    def prepend(self, data):
        new_node = Node(data)

        if self.head is None:
            new_node.next = None
            self.head = new_node
        else:
            self.head.prev = new_node
            new_node.next = self.head
            self.head = new_node
            new_node.prev = None

    def insert_after_node(self, node, data):
        new_node = Node(data)

        new_node.next = node.next
        node.next = new_node
        new_node.prev = node
        if new_node.next is not None:
            new_node.next.prev = new_node

    def insert_before_node(self, node, data):
        new_node = Node(data)

        new_node.prev = node.prev
        node.prev = new_node
        new_node.next = node
        if new_node.prev is not None:
            new_node.prev.next = new_node
        else:
            self.head = new_node

    def delete_node(self, node):
        if self.head == node:
            self.head = node.next

        if node.next is not None:
            node.next.prev = node.prev
        if node.prev is not None:
            node.prev.next = node.next

    def print_forward(self):
        current = self.head
        while current:
            print(current.data)
            current = current.next

    def print_backward(self):
        current = self.head
        while current.next:
            current = current.next
        while current:
            print(current.data)
            current = current.prev

双链表方法示例

示例一:向双链表中添加节点

doubly_linked_list = DoublyLinkedList()
doubly_linked_list.append(1)
doubly_linked_list.append(2)
doubly_linked_list.append(3)

打印链表:

doubly_linked_list.print_forward()
# 输出
1
2
3

示例二:从双链表中删除节点

node = doubly_linked_list.head.next
doubly_linked_list.delete_node(node)

打印链表:

doubly_linked_list.print_forward()
# 输出
1
3

栈实现方法示例

定义栈类

使用列表实现栈,包含以下三个方法:

  1. __init__:初始化栈
  2. push:入栈
  3. pop:出栈
class Stack:
    def __init__(self):
        self.stack = []

    def push(self, data):
        self.stack.append(data)

    def pop(self):
        if self.is_empty():
            return None
        else:
            return self.stack.pop()

    def is_empty(self):
        return len(self.stack) == 0

栈方法示例

示例一:使用栈实现括号匹配

def is_parenthesis_balanced(parenthesis_string):
    stack = Stack()
    for char in parenthesis_string:
        if char in '({[':
            stack.push(char)
        else:
            if stack.is_empty():
                return False
            current_char = stack.pop()
            if current_char == '(':
                if char != ')':
                    return False
            if current_char == '{':
                if char != '}':
                    return False
            if current_char == '[':
                if char != ']':
                    return False
    if stack.is_empty():
        return True
    else:
        return False

print(is_parenthesis_balanced('{(a+b)*(c-d)}'))
# 输出
True

print(is_parenthesis_balanced('([a+b))'))
# 输出
False

示例二:使用栈实现十进制转二进制

def decimal_to_binary(decimal_number):
    stack = Stack()

    while decimal_number > 0:
        remainder = decimal_number % 2
        stack.push(remainder)
        decimal_number = decimal_number // 2

    binary_string = ""
    while not stack.is_empty():
        binary_string += str(stack.pop())

    return binary_string

print(decimal_to_binary(12345))
# 输出
'11000000111001'

队列实现方法示例

定义队列类

使用列表实现队列,包含以下三个方法:

  1. __init__:初始化队列
  2. enqueue:入队
  3. dequeue:出队
class Queue:
    def __init__(self):
        self.queue = []

    def enqueue(self, data):
        self.queue.append(data)

    def dequeue(self):
        if self.is_empty():
            return None
        else:
            return self.queue.pop(0)

    def is_empty(self):
        return len(self.queue) == 0

队列方法示例

示例一:使用队列实现烫手山芋游戏

def hot_potato(players, num):
    queue = Queue()
    for player in players:
        queue.enqueue(player)

    while queue.is_empty() is False:
        for i in range(n):
            queue.enqueue(queue.dequeue())

        eliminated_player = queue.dequeue()
        print('Player {} is eliminated'.format(eliminated_player))

        if queue.size() == 1:
            return queue.dequeue()

print(hot_potato(['John', 'Bob', 'Mike', 'Alice', 'Bill'], 4))
# 输出
Player Mike is eliminated
Player Alice is eliminated
Player Bob is eliminated
Player Bill is eliminated
John

示例二:使用队列进行BFS(广度优先搜索)

def bfs(graph, start_node):
    visited = []
    queue = Queue()

    visited.append(start_node)
    queue.enqueue(start_node)

    while not queue.is_empty():
        current_node = queue.dequeue()
        print(current_node)

        for neighbor in graph[current_node]:
            if neighbor not in visited:
                visited.append(neighbor)
                queue.enqueue(neighbor)

graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}

bfs(graph, 'A')
# 输出
A
B
C
D
E
F

二叉树实现方法示例

定义二叉树节点类

定义二叉树节点,包含以下属性:

  1. data:当前节点的数据
  2. left_child:左子节点指针
  3. right_child:右子节点指针
class Node:
    def __init__(self, data):
        self.data = data
        self.left_child = None
        self.right_child = None

二叉树方法示例

示例一:插入节点到二叉树中

class BinaryTree:
    def __init__(self):
        self.root = None

    def insert(self, data):
        if self.root is None:
            self.root = Node(data)
        else:
            self._insert(data, self.root)

    def _insert(self, data, current):
        if data < current.data:
            if current.left_child is None:
                current.left_child = Node(data)
            else:
                self._insert(data, current.left_child)
        elif data > current.data:
            if current.right_child is None:
                current.right_child = Node(data)
            else:
                self._insert(data, current.right_child)
        else:
            print("The value is already present in the tree")

binary_tree = BinaryTree()
binary_tree.insert(6)
binary_tree.insert(10)
binary_tree.insert(3)
binary_tree.insert(4)
binary_tree.insert(5)
binary_tree.insert(8)
binary_tree.insert(2)

示例二:前序遍历二叉树

class BinaryTree:
    def __init__(self):
        self.root = None

    def insert(self, data):
        if self.root is None:
            self.root = Node(data)
        else:
            self._insert(data, self.root)

    def _insert(self, data, current):
        if data < current.data:
            if current.left_child is None:
                current.left_child = Node(data)
            else:
                self._insert(data, current.left_child)
        elif data > current.data:
            if current.right_child is None:
                current.right_child = Node(data)
            else:
                self._insert(data, current.right_child)
        else:
            print("The value is already present in the tree")

    def preorder_traversal(self):
        self._preorder_traversal(self.root)

    def _preorder_traversal(self, current):
        if current is not None:
            print(current.data)
            self._preorder_traversal(current.left_child)
            self._preorder_traversal(current.right_child)

binary_tree = BinaryTree()
binary_tree.insert(6)
binary_tree.insert(10)
binary_tree.insert(3)
binary_tree.insert(4)
binary_tree.insert(5)
binary_tree.insert(8)
binary_tree.insert(2)

binary_tree.preorder_traversal()
# 输出
6
3
2
4
5
10
8

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python编程实现双链表,栈,队列及二叉树的方法示例 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • mac安装jdk及环境变量配置文件

    下面是macOS操作系统中安装JDK及环境变量配置文件的完整攻略。 安装JDK 首先访问Oracle官网的JDK下载页面 https://www.oracle.com/java/technologies/javase-downloads.html,找到所需版本的JDK并点击下载。 等待下载完成后,双击下载的 “.dmg” 安装包文件。安装向导将引导您完成安装…

    other 2023年6月27日
    00
  • PyCharm鼠标右键不显示Run unittest的解决方法

    问题描述: 在使用PyCharm编写Python代码时,鼠标右键菜单中没有“Run unitttest”选项,无法快速进行单元测试。 解决方法: 确认PyCharm安装了unittest模块 在PyCharm中打开Python Console(在菜单栏中选择Tools -> Python Console),输入以下代码: import unittest…

    other 2023年6月27日
    00
  • 在mac中怎么显示隐藏文件夹

    在mac中如何显示隐藏文件夹 macOS系统中,有一些系统文件夹是默认被隐藏起来的,例如.bash_profile、Library等。这是为了保护系统文件不被误操作删除,但对于一些高级用户来说,这些隐藏文件确实是需要经常访问的,那么该如何在mac中显示这些隐藏文件夹呢? 方法一:使用终端命令 在终端中输入以下命令,可以显示所有隐藏的文件夹和文件: defau…

    其他 2023年3月29日
    00
  • 详谈Python基础之内置函数和递归

    详谈Python基础之内置函数和递归 前言 Python是一门高级编程语言,由于其简洁、易读、易学等特点,被越来越多的开发者所喜爱。而Python的内置函数和递归则是Python编程中的重要组成部分,为我们编写高效、简洁的代码提供了有力的支持。 一、内置函数 1.1 什么是内置函数 Python中自带了很多函数,这些函数直接可以在代码中使用,不需要导入。这些…

    other 2023年6月27日
    00
  • 史上最牛的WINDOWS系统文件详解第1/3页

    首先,需要明确“史上最牛的WINDOWS系统文件详解第1/3页”指的是什么。这是一篇论文或者文章的标题,猜测是关于对WINDOWS系统文件的详细解析和分析。 文章的攻略可以分为以下几个步骤: 1.阅读文章,理解其主要内容和结构。 2.了解WINDOWS系统文件的基本概念和结构,包括文件类型、存储路径、权限等。 3.分析文章中给出的示例,理解其中的具体细节和原…

    other 2023年6月27日
    00
  • java连接zookeeper实现zookeeper教程

    Java连接Zookeeper实现Zookeeper教程 在Java项目中,可以使用zookeeper来实现分布式锁、服务注册与发现等功能,本文将详细介绍Java如何连接zookeeper并实现相关功能。 1. Zookeeper简介 Zookeeper是用来实现分布式应用程序协调的开源软件,它是Google的Chubby的开源实现。Zookeeper的设计…

    other 2023年6月27日
    00
  • ORACLE SQL语句优化技术分析

    ORACLE SQL语句优化技术分析完整攻略 简介 SQL语句是数据库关键操作指令之一,一旦SQL语句存在性能问题,就会导致数据库操作效率低下、响应缓慢等问题,因此优化SQL语句十分重要。本文将介绍ORACLE SQL语句优化的相关技术和分析方法,完整攻略如下: SQL语句优化技术 查询计划分析技术 查询计划是涉及到数据库查询优化的核心问题之一,通过查询计划…

    other 2023年6月25日
    00
  • C语言超详细讲解数据结构中双向带头循环链表

    C语言超详细讲解数据结构中双向带头循环链表 什么是双向带头循环链表 双向带头循环链表是一种非常常用的数据结构,它由多个节点组成,每个节点都有一个前驱指针和一个后继指针,形成一个双向链表;同时,它也是循环链表,即链表的头指针和尾指针是相连的形成一个环的结构;而带头链表则是在链表的开头添加一个头节点来方便书写,方便读者理解,常见于书籍和教程中。 因此,双向带头循…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部