首页 > 其他分享 >数据结构-树

数据结构-树

时间:2024-04-13 17:14:19浏览次数:23  
标签:node self 节点 key ._ 数据结构 recursively

数据结构-树

1. 定义:

树是一种分层数据结构,由节点组成。每棵树有一个根节点,每个节点除了根节点外都恰有一个父节点,并可能有多个子节点。它是一种非线性数据结构,用于表示具有层级关系的数据。

class TreeNode:
    def __init__(self, data):
        self.data = data
        self.children = []

2. 术语:

关键术语包括根节点(树的顶端节点)、子节点(从另一个节点延伸的节点)、叶节点(没有子节点的节点)、深度(从根节点到特定节点的路径长度)、高度(树中节点的最大深度)。

3. 类型:

树的类型多种多样,包括二叉树(每个节点最多有两个子节点)、平衡树(如AVL树,确保任何时候左右子树的高度差不超过一)、搜索树(如二叉搜索树,左子树节点值小于父节点,右子树节点值大于父节点),等等。

4. 操作:

常见的树操作包括插入、删除、遍历(如前序、中序、后序和层次遍历)等。不同类型的树有其特定的操作方式和用途。

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

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

    def insert(self, key):
        if not self.root:
            self.root = TreeNode(key)
        else:
            self._insert_recursively(self.root, key)

    def _insert_recursively(self, node, key):
        if key < node.key:
            if node.left is None:
                node.left = TreeNode(key)
            else:
                self._insert_recursively(node.left, key)
        elif key > node.key:
            if node.right is None:
                node.right = TreeNode(key)
            else:
                self._insert_recursively(node.right, key)
        # 如果 key 已经存在于树中,则不进行任何操作

    def delete(self, key):
        self.root = self._delete_recursively(self.root, key)

    def _delete_recursively(self, node, key):
        if node is None:
            return node

        if key < node.key:
            node.left = self._delete_recursively(node.left, key)
        elif key > node.key:
            node.right = self._delete_recursively(node.right, key)
        else:
            if node.left is None:
                return node.right
            elif node.right is None:
                return node.left

            # 找到右子树的最小节点,将其替换到当前节点
            node.key = self._min_value_node(node.right).key
            node.right = self._delete_recursively(node.right, node.key)

        return node

    def _min_value_node(self, node):
        current = node
        while current.left is not None:
            current = current.left
        return current

    def preorder_traversal(self):
        return self._preorder_recursively(self.root)

    def _preorder_recursively(self, node):
        if node is not None:
            print(node.key, end=" ")
            self._preorder_recursively(node.left)
            self._preorder_recursively(node.right)

    def inorder_traversal(self):
        return self._inorder_recursively(self.root)

    def _inorder_recursively(self, node):
        if node is not None:
            self._inorder_recursively(node.left)
            print(node.key, end=" ")
            self._inorder_recursively(node.right)

    def postorder_traversal(self):
        return self._postorder_recursively(self.root)

    def _postorder_recursively(self, node):
        if node is not None:
            self._postorder_recursively(node.left)
            self._postorder_recursively(node.right)
            print(node.key, end=" ")

    def level_order_traversal(self):
        if self.root is None:
            return

        queue = [self.root]
        while queue:
            node = queue.pop(0)
            print(node.key, end=" ")

            if node.left is not None:
                queue.append(node.left)
            if node.right is not None:
                queue.append(node.right)

# 测试代码
def main():
    bst = BinaryTree()
    keys = [10, 5, 15, 3, 7, 12, 18]

    for key in keys:
        bst.insert(key)

    print("Preorder Traversal:")
    bst.preorder_traversal()
    print("\nInorder Traversal:")
    bst.inorder_traversal()
    print("\nPostorder Traversal:")
    bst.postorder_traversal()
    print("\nLevel-order Traversal:")
    bst.level_order_traversal()

    # 删除节点
    bst.delete(10)
    print("\nAfter deleting 10:")
    bst.inorder_traversal()

if __name__ == "__main__":
    main()

二叉搜索树(Binary Search Tree),它是一种特殊类型的树,具有以下特点:

  • 每个节点最多有两个子节点:左子节点和右子节点。
  • 左子节点的值小于父节点的值,右子节点的值大于父节点的值。
  • 这种有序性质使得插入、删除、搜索等操作的时间复杂度可以达到 O(log n)。

提供了以下操作:

  • 插入(insert):向树中插入一个新节点。
def insert(self, key):
        if not self.root:
            self.root = TreeNode(key)
        else:
            self._insert_recursively(self.root, key)
  • 删除(delete):从树中删除一个指定节点。
def delete(self, key):
        self.root = self._delete_recursively(self.root, key)
  • 前序遍历(preorder traversal):先访问根节点,然后递归地遍历左子树和右子树。
def preorder_traversal(self):
        return self._preorder_recursively(self.root)
  • 中序遍历(inorder traversal):先递归地遍历左子树,然后访问根节点,最后递归地遍历右子树。这种遍历方式可以将树的所有节点按照升序排列。
def inorder_traversal(self):
        return self._inorder_recursively(self.root)
  • 后序遍历(postorder traversal):先递归地遍历左子树和右子树,然后访问根节点。
def postorder_traversal(self):
        return self._postorder_recursively(self.root)
  • 层次遍历(level-order traversal):从上到下逐层遍历树的节点。
def level_order_traversal(self):
        if self.root is None:
            return
        queue = [self.root]
        while queue:
            node = queue.pop(0)
            print(node.key, end=" ")

            if node.left is not None:
                queue.append(node.left)
            if node.right is not None:
                queue.append(node.right)
  1. 应用:
    树在计算机科学中有广泛应用,如用于表示家族谱系、组织结构图、数据索引结构(如数据库中的B树和B+树)、决策流程(如决策树)等。

标签:node,self,节点,key,._,数据结构,recursively
From: https://www.cnblogs.com/zx-demo/p/18133066

相关文章

  • 数据结构-图
    数据结构-图1.定义:图是一种由节点(或称为顶点)和连接这些节点的边组成的数据结构。图可以用来表示任何二元关系,比如路线、网络、状态转换等。在Python中,可以使用邻接表或邻接矩阵来表示图classGraph:def__init__(self):self.graph={}2.类型:图分为有向......
  • 数据结构-队列
    数据结构-队列1.定义:队列是一种遵循先进先出(FIFO,FirstInFirstOut)原则的线性数据结构。在队列中,元素从一端添加(队尾),从另一端移除(队头)。classQueue:def__init__(self):self.items=[]主要操作:队列的主要操作包括enqueue(向队尾添加元素)、dequeue(从队头......
  • 数据结构-栈
    数据结构-栈1.定义:栈是一种只能在一端进行插入和删除操作的线性数据结构。它遵循后进先出(LIFO,LastInFirstOut)的原则,即最后插入的元素将是第一个被移除的classStack:def__init__(self):self.items=[]defis_empty(self):returnself.ite......
  • 数据结构-堆
    数据结构-堆1.定义:堆是一种特殊的完全二叉树。在堆中,所有的父节点都满足特定的顺序关系(大于或小于)与它们的子节点。这种属性使得堆在处理优先级队列和排序操作时非常有效。2.类型:常见的两种类型的堆是最大堆和最小堆。在最大堆中,每个父节点的值都大于或等于其子节点的值;而在......
  • 数据结构-哈希表
    数据结构-哈希表1.定义:哈希表(也称为散列表)是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。它通过将键映射到表中一个位置来访问记录,从而加快访问速度。#创建一个空字典hash_table={}#向哈希表中添加键-值对hash_table['apple']=10hash_table['banana'......
  • 数据结构-链表
    数据结构-链表1.链表的基本概念:链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向列表中下一个节点的引用(或指针)。2.单向链表:单向链表的每个节点只有一个指向下一个节点的链接。这种结构使得遍历只能单向进行,从头节点开始到尾节点结束。classNode:d......
  • 数据结构基础概念
    数据结构基础概念数据结构概念数据结构是计算机科学中用于组织和存储数据的方式。它定义了数据之间的关系,提供了一组操作以访问和修改数据。选择合适的数据结构对于解决特定问题至关重要,不同的数据结构适用于不同的应用场景。以下是数据结构的基本概念:数据元素:数据结构中的基......
  • 数据结构知识框架
    数据结构知识框架B树平衡的多叉树性质根结点至少有两个孩子每个非根结点至少有M/2(上取整)个孩子,至多有M个孩子每个非根结点至少有M/2-1(上取整)个关键字,并且以升序排列key[i]和key[i+1]之间的孩子结点的值介于key[i]、key[i+1]之间所有的叶子结点都在同一层B+树性质......
  • 后缀数据结构
    byDuck.后缀数组参考:后缀数组简介-OIWiki后缀数组(SuffixArray,SA)可以在\(\mathcal{O}(n\logn)\)的复杂度内对\(S\)的每个后缀进行字典序排序。记后缀\(i\)表示后缀\(S[i,n]\)。SA的核心在于得到两个数组\(sa,rk\)。\(sa_i\)表示字典序排名为\(i\)的后缀位......
  • 数据结构(图)
    图是一种非线性数据结构,由顶点(节点)和边组成,用于描述不同对象之间的关系。在图中,顶点表示对象,边表示对象之间的关系,可以是有向的(箭头表示方向)也可以是无向的(没有方向)。图的定义包括以下几个重要概念:顶点(Vertex):图中的节点,可以表示对象或实体。边(Edge):连接顶点的线,表示顶点之间的关......