十二、数据结构——二叉树基本概念及特点

数据结构中的二叉树

目录

一、二叉树的基本概念

二叉树是一种重要的数据结构,它是每个节点最多有两个子节点的树结构。在二叉树中,每个节点都可以有左子节点和右子节点,也可以没有子节点。

二、二叉树的特点

  • 每个节点最多有两个子节点,分别是左子节点和右子节点。

  • 二叉树的子树也是二叉树,即左子树和右子树都是二叉树。

  • 二叉树可以为空,即没有任何节点。

  • 第k层上的节点个数最多为2^(k-1)个

  • 深度为k的二叉树最多有2^k -1个节点

  • 二叉树的高度:二叉树的高度是指从根节点到最深层的最长路径的长度。对于有n个节点的二叉树,其高度不会超过n,即h <= n。对于平衡二叉树,其高度为O(log n),使得查找和插入等操作具有较高的效率。

三、二叉树的分类

二叉树可以根据节点的子节点个数进行分类,常见的二叉树包括:

  1. 满二叉树 :除了叶节点外,每个节点都有两个子节点,并且所有叶节点都在同一层上。

  2. 完全二叉树 :除了最后一层外,其他层的节点数都达到最大值,最后一层的节点依次从左到右排列。(只有最下面两层有度数小于2的节点,且最下面一层的叶节点集中在最左边的若干位置上)

  3. 平衡二叉树:左右子树的高度差不超过1的二叉树,保持树的平衡,以提高查找性能。

二叉树的存储结构

二叉树的存储结构有两种常见的方式:顺序存储链式存储

(一)顺序存储

顺序存储是使用数组来表示二叉树,按照层次顺序将二叉树的节点存储在数组中。假设二叉树的根节点存储在数组索引为0的位置,那么第i个节点的左子节点存储在索引为2i+1的位置,右子节点存储在索引为2i+2的位置。如果节点为空,用特定的值(如NULL)表示。

c 复制代码
// 二叉树的顺序存储示例
#define MAX_SIZE 100
int tree[MAX_SIZE];

// 初始化树
void initTree() {
    for (int i = 0; i < MAX_SIZE; i++) {
        tree[i] = NULL;
    }
}

// 添加节点
void addNode(int value, int index) {
    tree[index] = value;
}

// 获取左子节点
int getLeftChild(int index) {
    return tree[2 * index + 1];
}

// 获取右子节点
int getRightChild(int index) {
    return tree[2 * index + 2];
}

(二)链式存储

链式存储是使用指针来表示二叉树,每个节点包含数据和指向左右子节点的指针。通过指针,可以将各个节点串联起来,形成一棵完整的二叉树。

c 复制代码
// 二叉树的链式存储示例
typedef struct TreeNode {
    int data;
    struct TreeNode* left;
    struct TreeNode* right;
} TreeNode;

// 创建节点
TreeNode* createNode(int value) {
    TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
    newNode->data = value;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

// 添加节点
void addNode(TreeNode* parent, TreeNode* leftChild, TreeNode* rightChild) {
    parent->left = leftChild;
    parent->right = rightChild;
}
相关推荐
_清歌3 小时前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法
统计实现局3 小时前
SVD 的三步走:双对角化、Givens 收敛、排序
算法
躬行见万象3 小时前
《VLA 系列》UniLab 强化训练 | G1 机器人 |复现
算法
统计实现局3 小时前
对称不定分解(Bunch-Kaufman):为什么 Cholesky 不够用
算法
统计实现局3 小时前
dqrsl 拆解:拿着 QR 结果能算出哪 5 种东西
算法
统计实现局3 小时前
为什么 Cholesky 求逆比 Gauss-Jordan 快一倍——行列式溢出防护详
算法
To_OC14 小时前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
金銀銅鐵18 小时前
[Python] 扩展欧几里得算法
python·数学·算法
To_OC20 小时前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode