数据结构编程实践20讲(Python版)—05二叉树

往期链接

01 数组 02 链表 03 栈 04 队列

写在前面:大“树”下好乘凉

定义

树(Tree)是一种非线性的层次化数据结构,由节点和连接节点的边组成。它模拟了一个倒置的树,根在顶部,分支向下延伸。

主要术语

  • 节点(Node): 树中的基本单元,包含数据和指向其他节点的链接。
  • 根节点(Root): 树的顶层节点,没有父节点。
  • 父节点(Parent): 直接连接到其下层节点的节点。
  • 子节点(Child): 直接连接到其上层节点的节点。
  • 叶节点(Leaf): 没有子节点的节点。
  • 内部节点(Internal Node): 至少有一个子节点的非叶节点。
  • 兄弟节点(Siblings): 具有相同父节点的节点。
  • 边(Edge): 连接两个节点的线。
  • 路径(Path): 从一个节点到另一个节点的节点序列。
  • 深度(Depth): 从根节点到特定节点的边的数量。
  • 高度(Height): 从节点到其最远叶子节点的最长路径上的边的数量。
  • 子树(Subtree): 由节点和其所有后代组成的树。

在这里插入图片描述

基本特征

  • 层次结构: 树形结构天然地表示层次关系。
  • 递归性: 每个子树本身也是一棵树。
  • 无环: 树中不存在环路。
  • 连通性: 任意两个节点之间有且仅有一条路径。
  • n个节点的树有n-1条边
  • 动态性: 树结构可以方便地进行插入、删除操作。

主要应用领域:

  • 文件系统: 操作系统中用于组织文件和目录。
  • 数据库索引: B树和B+树用于实现高效的数据检索。
  • 编译器设计: 抽象语法树用于表示程序的结构。
  • 网络路由: 用于IP地址查找和数据包转发。
  • 人工智能: 决策树用于分类和预测。
  • 图形渲染: 场景图和BSP树用于3D图形渲染。
  • 压缩算法: 哈夫曼树用于数据压缩。
  • 搜索引擎: Trie树用于快速字符串匹配。
  • XML/HTML解析: DOM树用于表示文档结构。
  • 生物信息学: 用于表示生物分类和进化关系。

05 二叉树Binary tree

S1 说明

二叉树是一种特殊的树形数据结构,其中每个节点最多有两个子节点,通常称为"左子节点"和"右子节点"。二叉树的主要特点包括:

  • 每个节点最多有两个子节点
  • 左子节点通常表示小于父节点的值
  • 右子节点通常表示大于或等于父节点的值
  • 可以为空(称为空树)

二叉树的一些重要概念:

  • 根节点:树的顶部节点
  • 叶节点:没有子节点的节点
  • 深度:从根到该节点的边的数量
  • 高度:从该节点到最远叶节点的边的数量

S2 示例

import matplotlib.pyplot as plt
import networkx as nx


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


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

    def insert(self, value):
        if not self.root:
            self.root = TreeNode(value)
        else:
            self._insert_recursive(self.root, value)

    def _insert_recursive(self, node, value):
        if value < node.value:
            if node.left is None:
                node.left = TreeNode(value)
            else:
                self._insert_recursive(node.left, value)
        else:
            if node.right is None:
                node.right = TreeNode(value)
            else:
                self._insert_recursive(node.right, value)

    def inorder_traversal(self):
        result = []
        self._inorder_recursive(self.root, result)
        return result

    def _inorder_recursive(self
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AnFany

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值