程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

二叉树(Binary Tree)

balukai 2025-04-23 22:05:45 文章精选 5 ℃

二叉树(Binary Tree)是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树是许多高级数据结构(如二叉搜索树、堆、AVL树等)的基础。


二叉树的特点

  1. 节点结构
  • 每个节点包含:
  • 数据域(存储数据)。
  • 左子节点指针。
  • 右子节点指针。


  1. 基本性质
  • 每个节点最多有两个子节点。
  • 左子节点和右子节点是有序的,不能随意交换。
  1. 特殊类型
  • 满二叉树:每个节点都有 0 或 2 个子节点。
  • 完全二叉树:除了最后一层,其他层都是满的,且最后一层的节点尽量靠左。
  • 二叉搜索树(BST):左子树的值小于根节点,右子树的值大于根节点。
  • 平衡二叉树:左右子树的高度差不超过 1(如 AVL 树、红黑树)。

二叉树的遍历

二叉树的遍历是指按照某种顺序访问树中的所有节点。常见的遍历方式有:

  1. 前序遍历(Preorder Traversal)
  • 访问顺序:根节点 → 左子树 → 右子树。
  • 应用:复制二叉树、表达式树的前缀表示。
  1. 中序遍历(Inorder Traversal)
  • 访问顺序:左子树 → 根节点 → 右子树。
  • 应用:二叉搜索树的中序遍历结果是升序序列。
  1. 后序遍历(Postorder Traversal)
  • 访问顺序:左子树 → 右子树 → 根节点。
  • 应用:删除二叉树、表达式树的后缀表示。
  1. 层序遍历(Level Order Traversal)
  • 按层次从上到下、从左到右访问节点。
  • 应用:计算二叉树的高度、宽度等。

二叉树的实现

以下是C语言实现二叉树的代码,包括节点的创建、插入和遍历操作:

#include <stdio.h>
#include <stdlib.h>

// 定义二叉树节点结构
typedef struct Node {
    int data;           // 节点数据
    struct Node *left;  // 左子节点指针
    struct Node *right; // 右子节点指针
} Node;

// 创建新节点
Node *createNode(int data) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    if (newNode == NULL) {
        printf("内存分配失败!\n");
        exit(1);
    }
    newNode->data = data;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

// 插入节点(简单示例,非二叉搜索树)
void insertNode(Node **root, int data) {
    if (*root == NULL) {
        *root = createNode(data);
    } else {
        // 简单示例:交替插入左右子树
        if ((*root)->left == NULL) {
            insertNode(&((*root)->left), data);
        } else {
            insertNode(&((*root)->right), data);
        }
    }
}

// 前序遍历
void preorderTraversal(Node *root) {
    if (root == NULL) {
        return;
    }
    printf("%d ", root->data); // 访问根节点
    preorderTraversal(root->left); // 遍历左子树
    preorderTraversal(root->right); // 遍历右子树
}

// 中序遍历
void inorderTraversal(Node *root) {
    if (root == NULL) {
        return;
    }
    inorderTraversal(root->left); // 遍历左子树
    printf("%d ", root->data); // 访问根节点
    inorderTraversal(root->right); // 遍历右子树
}

// 后序遍历
void postorderTraversal(Node *root) {
    if (root == NULL) {
        return;
    }
    postorderTraversal(root->left); // 遍历左子树
    postorderTraversal(root->right); // 遍历右子树
    printf("%d ", root->data); // 访问根节点
}

// 层序遍历(使用队列)
void levelOrderTraversal(Node *root) {
    if (root == NULL) {
        return;
    }
    // 创建队列
    Node *queue[100]; // 假设队列最大容量为100
    int front = 0, rear = 0;
    queue[rear++] = root; // 根节点入队

    while (front < rear) {
        Node *current = queue[front++]; // 出队
        printf("%d ", current->data); // 访问当前节点

        // 左子节点入队
        if (current->left != NULL) {
            queue[rear++] = current->left;
        }
        // 右子节点入队
        if (current->right != NULL) {
            queue[rear++] = current->right;
        }
    }
}

// 释放二叉树内存
void freeTree(Node *root) {
    if (root == NULL) {
        return;
    }
    freeTree(root->left); // 释放左子树
    freeTree(root->right); // 释放右子树
    free(root); // 释放当前节点
}

int main() {
    Node *root = NULL;

    // 插入节点
    insertNode(&root, 1);
    insertNode(&root, 2);
    insertNode(&root, 3);
    insertNode(&root, 4);
    insertNode(&root, 5);

    // 遍历二叉树
    printf("前序遍历:");
    preorderTraversal(root);
    printf("\n");

    printf("中序遍历:");
    inorderTraversal(root);
    printf("\n");

    printf("后序遍历:");
    postorderTraversal(root);
    printf("\n");

    printf("层序遍历:");
    levelOrderTraversal(root);
    printf("\n");

    // 释放二叉树内存
    freeTree(root);

    return 0;
}

代码说明

  1. createNode 函数
  • 创建一个新节点并返回。
  1. insertNode 函数
  • 在二叉树中插入新节点(简单示例,非二叉搜索树)。
  1. 遍历函数
  • preorderTraversal:前序遍历。
  • inorderTraversal:中序遍历。
  • postorderTraversal:后序遍历。
  • levelOrderTraversal:层序遍历(使用队列实现)。
  1. freeTree 函数
  • 递归释放二叉树的内存。
  1. 主函数
  • 创建二叉树并插入节点。
  • 遍历二叉树并输出结果。
  • 释放二叉树内存。

示例输出

前序遍历:1 2 4 5 3 
中序遍历:4 2 5 1 3 
后序遍历:4 5 2 3 1 
层序遍历:1 2 3 4 5 

总结

  • 二叉树是一种基础且重要的数据结构,广泛应用于算法和程序设计中。
  • 通过递归可以轻松实现二叉树的遍历和操作。
  • 二叉树的变种(如二叉搜索树、平衡二叉树)在实际应用中非常有用。

通过实现二叉树,可以更好地理解树形数据结构的原理和应用!

最近发表
标签列表