欢迎访问宙启技术站
智能推送

Python函数实现数据结构:链表和树

发布时间:2023-06-01 01:44:17

Python是一种简单易学、高效实用的编程语言,适合用来实现各种数据结构。在本文中,我们将重点讨论如何使用Python函数实现两种重要的数据结构,即链表和树。

一、链表

链表是一种线性数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表不需要连续的内存空间,因此可以动态地进行插入和删除操作。

在Python中,我们可以使用类来实现链表。一个节点可以表示为一个类,它包含一个数据元素和一个指向下一个节点的指针。我们可以定义一个链表类,它包含一个头节点的指针和一些基本的操作方法,如插入、删除和遍历。下面是一个简单的链表类的示例代码:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
    
class LinkedList:
    def __init__(self):
        self.head = None
    
    def insert(self, val):
        node = ListNode(val)
        if self.head is None:
            self.head = node
        else:
            cur = self.head
            while cur.next is not None:
                cur = cur.next
            cur.next = node
    
    def delete(self, val):
        if self.head is None:
            return
        if self.head.val == val:
            self.head = self.head.next
            return
        cur = self.head
        while cur.next is not None:
            if cur.next.val == val:
                cur.next = cur.next.next
                return
            cur = cur.next
    
    def traverse(self):
        res = []
        cur = self.head
        while cur is not None:
            res.append(cur.val)
            cur = cur.next
        return res

上面的代码中,ListNode类表示链表的节点,LinkedList类表示链表。在LinkedList类中,insert方法用于在链表末尾插入一个节点,delete方法用于删除链表中的某个节点,traverse方法用于遍历链表,返回链表中所有节点的值。

二、树

树是一种非线性数据结构,它由一些称为节点的元素和连接它们的边组成。每个节点至多有一个父节点和多个子节点。树的最顶层节点称为根节点,没有子节点的节点称为叶节点。

在Python中,我们可以使用类来实现树。一个节点可以表示为一个类,它包含一个值和左右子节点的指针。我们可以定义一个树类,它包含一个根节点的指针和一些基本的操作方法,如插入、删除和遍历。下面是一个简单的树类的示例代码:

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

class Tree:
    def __init__(self):
        self.root = None
    
    def insert(self, val):
        if self.root is None:
            self.root = TreeNode(val)
            return
        cur = self.root
        while cur is not None:
            if val < cur.val:
                if cur.left is None:
                    cur.left = TreeNode(val)
                    return
                cur = cur.left
            else:
                if cur.right is None:
                    cur.right = TreeNode(val)
                    return
                cur = cur.right
    
    def delete(self, val):
        self.root = self._delete(self.root, val)
    
    def _delete(self, node, val):
        if node is None:
            return None
        if val < node.val:
            node.left = self._delete(node.left, val)
        elif val > node.val:
            node.right = self._delete(node.right, val)
        else:
            if node.left is None:
                return node.right
            elif node.right is None:
                return node.left
            else:
                tmp = self._find_max(node.left)
                node.val = tmp.val
                node.left = self._delete(node.left, tmp.val)
        return node
    
    def _find_max(self, node):
        while node.right is not None:
            node = node.right
        return node
    
    def traverse(self, mode):
        res = []
        if mode == 'preorder':
            self._preorder(self.root, res)
        elif mode == 'inorder':
            self._inorder(self.root, res)
        elif mode == 'postorder':
            self._postorder(self.root, res)
        return res
    
    def _preorder(self, node, res):
        if node is None:
            return
        res.append(node.val)
        self._preorder(node.left, res)
        self._preorder(node.right, res)
    
    def _inorder(self, node, res):
        if node is None:
            return
        self._inorder(node.left, res)
        res.append(node.val)
        self._inorder(node.right, res)
    
    def _postorder(self, node, res):
        if node is None:
            return
        self._postorder(node.left, res)
        self._postorder(node.right, res)
        res.append(node.val)

上面的代码中,TreeNode类表示树的节点,Tree类表示树。在Tree类中,insert方法用于插入一个节点,delete方法用于删除树中的某个节点,traverse方法用于遍历树。遍历树有三种方式:前序遍历、中序遍历、后序遍历。三种遍历方式的区别是指访问节点的顺序不同。

总结

链表和树是计算机科学中非常重要的数据结构,它们在各种应用中都有着广泛的应用。在Python中,我们可以使用类和函数来实现这些数据结构。链表和树操作方法的实现和具体的应用息息相关,对于不同的应用场景,我们需要根据实际需求来设计相应的操作方法。