• 算法-二叉树


    1. 二叉树定义

    二叉树是一种常见的树状数据结构,它由节点组成,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的定义如下:

    • 节点(Node):每个节点包含一个数据元素(通常是一个值)以及指向其左子节点和右子节点的指针。这个数据元素可以是整数、字符、对象等,具体取决于应用程序的需求。
    • 根节点(Root Node):二叉树的顶部节点称为根节点。它是树的起点,通常是访问整个二叉树的入口点。
    • 叶子节点(Leaf Node):叶子节点是没有子节点的节点,它们位于二叉树的底部。
    • 父节点(Parent Node):每个节点都可以有一个父节点,即指向它的节点。
    • 子节点(Child Node):每个节点最多有两个子节点,分别称为左子节点和右子节点。
    • 深度(Depth):从根节点到某个节点的唯一路径上的边数称为该节点的深度。
    • 高度(Height):二叉树的高度是树中任何节点的最大深度。也可以定义为空树的高度为-1,只有根节点的树的高度为0。
    • 子树(Subtree):二叉树中的任何节点都可以看作是根节点的子树,包含该节点及其所有后代节点。
    • 二叉搜索树(Binary Search Tree,BST):如果二叉树满足以下条件,即对于树中的每个节点,其左子树中的所有节点的值都小于它的值,而右子树中的所有节点的值都大于它的值,那么这棵树就是二叉搜索树。BST具有有序性质,因此在查找、插入和删除操作上具有高效性能。
    • 平衡二叉树(Balanced Binary Tree):平衡二叉树是一种特殊的二叉搜索树,其左子树和右子树的高度差不超过1。平衡二叉树的目的是确保树的高度不会过高,以保持高效的操作性能。

    1.1 二叉树的定义

    // 定义二叉树节点结构
    struct TreeNode {
        int data;
        struct TreeNode* left;
        struct TreeNode* right;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.2 二叉树的应用场景

    1. 文件系统:
      目录结构:Linux文件系统使用树形结构,其中每个目录可以包含子目录和文件。这种结构可以轻松地用二叉树表示,其中每个目录是一个节点,包含指向子目录和文件的指针。

    2. 进程管理:
      进程调度:操作系统使用调度算法来管理运行中的进程。二叉堆是一种二叉树数据结构,常用于实现进程调度算法(如最小堆)。

    3. 数据搜索:
      二叉搜索树:在Linux中,二叉搜索树(BST)常用于快速搜索和排序数据。例如,文件系统中的索引、数据库管理系统中的索引结构等都可以使用BST来实现高效的数据检索。

    4. 存储管理:
      内存管理:操作系统使用二叉树数据结构来管理系统内存,例如红黑树用于管理内存分配和释放的数据结构,以维护可用和已分配的内存块。

    5. 系统调用表:
      系统调用表:Linux内核维护了一个系统调用表,其中包含可用的系统调用和相应的函数指针。这个表可以用二叉树来组织,以便在系统调用的注册、查找和执行过程中实现高效的操作。

    6. 路由表:
      IP路由表:Linux路由表用于确定数据包应该通过哪个接口进行转发。通常,路由表的实现使用二叉树或其他数据结构,以便快速查找最佳路由。

    7. 进程树:
      进程树:在Linux系统中,进程通常以树状结构的方式组织,其中每个进程都有一个父进程和零个或多个子进程。这种组织结构可以看作是一个树,其中根是init进程,子进程是由父进程创建的。

    8. 日志文件管理:
      日志文件归档:一些应用程序需要管理大量的日志文件,这些文件可以使用二叉树来组织,以便快速查找和检索特定日期或事件的日志。

    2. 二叉树常用函数方法

    2.1 创建节点

    struct TreeNode* createNode(int data) {
        struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));
        if (newNode) {
            newNode->data = data;
            newNode->left = NULL;
            newNode->right = NULL;
        }
        return newNode;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.2 插入节点到二叉树

    struct TreeNode* insertNode(struct TreeNode* root, int data) {
        if (root == NULL) {
            return createNode(data);
        }
    
        if (data < root->data) {
            root->left = insertNode(root->left, data);
        } else if (data > root->data) {
            root->right = insertNode(root->right, data);
        }
    
        return root;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.3 二叉树遍历

    // 中序遍历二叉树(升序)
    void inorderTraversal(struct TreeNode* root) {
        if (root) {
            inorderTraversal(root->left);
            printf("%d ", root->data);
            inorderTraversal(root->right);
        }
    }
    
    // 前序遍历二叉树
    void preorderTraversal(struct TreeNode* root) {
        if (root) {
            printf("%d ", root->data);
            preorderTraversal(root->left);
            preorderTraversal(root->right);
        }
    }
    
    // 后序遍历二叉树
    void postorderTraversal(struct TreeNode* root) {
        if (root) {
            postorderTraversal(root->left);
            postorderTraversal(root->right);
            printf("%d ", root->data);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    2.4 二叉树深度计算

    // 计算二叉树的深度(递归函数)
    int calculateDepth(struct TreeNode* root) {
        if (root == NULL) {
            return 0;
        } else {
            int leftDepth = calculateDepth(root->left);
            int rightDepth = calculateDepth(root->right);
            return (leftDepth > rightDepth) ? (leftDepth + 1) : (rightDepth + 1);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    【PLC】现场总线和工业以太网汇总
    基于SSM的二手车交易系统
    python实现 合并相同编号的证书名称
    Java Integer.toBinaryString()方法具有什么功能呢?
    shell中分支语句,循环语句,函数
    前后端交互案例分析
    C++中只能有一个实例的单例类
    UDP-B-L-阿拉伯糖二钠盐,UDP-b-L-arabinopyranose disodium salt,15839-78-8
    【Android 系统】recovery字体大小修改
    Fushion 360齿轮组制作教程
  • 原文地址:https://blog.csdn.net/weixin_47139576/article/details/133688049