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

yizhihongxing

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日

相关文章

  • java运行时环境初始化时出现错误 你可能要重新安装flash cs5的解决方法(已测)

    Java运行时环境初始化时出现错误的解决方法 问题现象 在使用Flash CS5时,运行Java程序时可能会出现以下错误提示: Java 运行时环境初始化时出现错误,您可能要重新安装 Flash CS5。 此错误提示可能会导致Java程序无法正常运行,给用户带来困扰。 解决方法 对于这个问题,有以下几种解决方法: 方法1:检查Java安装状态 首先,我们需要…

    other 2023年6月20日
    00
  • Win11 KB5027292今日发布: Win11 Build 22000.2121预览版更新内容汇总

    Win11 KB5027292今日发布: Win11 Build 22000.2121预览版更新内容汇总攻略 简介 Win11 KB5027292是今日发布的Win11 Build 22000.2121预览版的更新补丁。本攻略将详细讲解该更新的内容,并提供两个示例说明。 更新内容汇总 以下是Win11 KB5027292更新的主要内容: 性能优化:该更新针对…

    other 2023年8月3日
    00
  • 如何使用Idea进行合并代码分支

    如何使用Idea进行合并代码分支攻略 在使用Idea进行合并代码分支之前,确保你已经完成以下准备工作: 确保你已经安装了最新版本的Idea集成开发环境。 确保你已经克隆了代码仓库,并且已经切换到要合并的分支。 下面是使用Idea进行合并代码分支的完整攻略: 步骤1:打开Idea并导航到版本控制工具 打开Idea集成开发环境。 导航到顶部菜单栏,选择 \”VC…

    other 2023年7月27日
    00
  • HTML转PDF的纯客户端和纯服务端实现方案

    实现HTML转PDF有两种方案:纯客户端方案和纯服务端方案。 纯客户端方案 纯客户端方案是指在前端页面上使用JavaScript将HTML转换为PDF,实现方式主要有以下两种。 使用jsPDF库 jsPDF是一个流行的用于生成PDF的JavaScript库,它可以直接在浏览器中生成PDF文档。使用jsPDF库,需要先在HTML中引入以下两个文件: <s…

    other 2023年6月27日
    00
  • app判断链接参数后缀跳转不同地址的方法

    当我们需要根据链接参数后缀来跳转到不同的地址时,可以使用以下方法: 首先,我们需要获取链接中的参数后缀。可以使用编程语言中的字符串处理函数或正则表达式来提取参数后缀。例如,在JavaScript中,可以使用window.location.search来获取链接中的查询字符串,然后使用字符串处理函数或正则表达式提取参数后缀。 接下来,我们可以使用条件语句(如i…

    other 2023年8月5日
    00
  • vue路由组件按需加载的几种方法小结

    下面是详细讲解“vue路由组件按需加载的几种方法小结”的完整攻略。在这篇攻略里,我们将讨论四种按需加载路由组件的方法。这将有助于您提高应用的性能,缩短您的网站加载时间。 方法一:使用 @loadable/component @loadable/component 是一个 JavaScript 库,用于按需加载组件。该库有助于避免在页面启动时加载所有 Java…

    other 2023年6月25日
    00
  • js获取当月最后一天

    JS获取当月最后一天 在业务开发当中,我们常常需要获取当月的最后一天。这里就介绍一种用JavaScript实现的方法,来获取当月的最后一天。 实现方式 我们可以通过获取当前月份和年份,然后根据月份来判断该月份最多有多少天。而判断月份最多有多少天的方法,就是通过下一个月减去1天,即可得到本月最后一天的日期。我们可以通过下面这个示例代码来实现: // 获取当月最…

    其他 2023年3月28日
    00
  • Vue body样式修改方式

    Vue body样式修改方式 1. 使用内联样式 在Vue中,可以直接通过给<body>标签添加style属性来修改body样式。这种方式适用于修改单个样式属性或者临时性的样式修改。例如: <template> <div> <button @click="changeBodyColor">C…

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