📜  栈和树的区别(1)

📅  最后修改于: 2023-12-03 15:40:27.107000             🧑  作者: Mango

栈和树的区别

在计算机科学中,栈(stack)和树(tree)是两个重要的数据结构。尽管它们都能被表示为一组节点和指向它们的指针,但它们之间存在许多差异。下面是栈和树的区别:

栈是一种特殊的数据结构,它基本上是一个“先进后出”的容器,只能在顶部插入和删除元素。最后插入的元素将被首先删除。

栈的特点
  1. 栈是一种LIFO(Last In,First Out)数据结构,即“后进先出”的数据结构
  2. 栈只允许在栈顶进行插入和删除操作
  3. 插入元素的操作称为“入栈”,删除元素的操作称为“出栈”
栈的应用场景
  • 计算机内存中的函数调用栈
  • 网页浏览器的“前进”和“后退”按钮
  • 编译器中的语法分析器
  • 超市购物篮
栈的代码实现
class Stack:
    def __init__(self):
        self.items = []

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

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def peek(self):
        return self.items[-1]

    def size(self):
        return len(self.items)

树也是一种由节点和指针组成的数据结构,可以很好地模拟现实生活中的树形结构。

树的特点
  1. 树是一种递归的数据结构,即一棵树可以看作是许多子树组成的大树。
  2. 树由节点和边组成,每个节点都有0个或多个子节点,每个边都连接两个节点。
  3. 树的顶部节点称为根节点,每个节点都有一个唯一的父节点,除根节点外每个节点可能有一个或多个子节点。
  4. 没有子节点的节点称为叶子节点。
树的应用场景
  • 文件系统结构
  • HTML DOM
  • 路由协议
树的代码实现
class Node:
    def __init__(self, data):
        self.left = None
        self.right = None
        self.data = data


class BinaryTree:
    def __init__(self, root):
        self.root = Node(root)

    def print_tree(self, traversal_type):
        if traversal_type == "preorder":
            return self.preorder_print(tree.root, "")
        elif traversal_type == "inorder":
            return self.inorder_print(tree.root, "")
        elif traversal_type == "postorder":
            return self.postorder_print(tree.root, "")

    def preorder_print(self, start, traversal):
        if start:
            traversal += (str(start.data) + "-")
            traversal = self.preorder_print(start.left, traversal)
            traversal = self.preorder_print(start.right, traversal)
        return traversal

    def inorder_print(self, start, traversal):
        if start:
            traversal = self.inorder_print(start.left, traversal)
            traversal += (str(start.data) + "-")
            traversal = self.inorder_print(start.right, traversal)
        return traversal

    def postorder_print(self, start, traversal):
        if start:
            traversal = self.postorder_print(start.left, traversal)
            traversal = self.postorder_print(start.right, traversal)
            traversal += (str(start.data) + "-")
        return traversal


# 实例化一棵二叉树
tree = BinaryTree(1)
tree.root.left = Node(2)
tree.root.right = Node(3)
tree.root.left.left = Node(4)
tree.root.left.right = Node(5)
tree.root.right.left = Node(6)
tree.root.right.right = Node(7)

print("Pre-order Traversal: ", tree.print_tree("preorder"))
print("In-order Traversal: ", tree.print_tree("inorder"))
print("Post-order Traversal: ", tree.print_tree("postorder"))