C语言二叉树学习笔记

server/2025/2/27 22:41:52/

C语言二叉树学习笔记


目录

  • 树的基本概念
  • 二叉树的定义与类型
  • 二叉排序树(BST)
  • 二叉树的遍历
  • 二叉树的操作
  • 总结

树的基本概念

1. 什么是树?

  • :一种非线性数据结构,由节点和边组成,模拟分层关系。
  • 核心术语
    • 根节点:树的顶层节点(唯一)。
    • 子节点/双亲节点:一个节点的直接下层节点称为子节点,该节点称为子节点的双亲节点。
    • 叶子节点:没有子节点的节点。
    • 节点的度:节点的子节点数量。
    • 树的深度/高度:树中节点的最大层次(根节点为第1层)。

2. 树的特点

  • 递归结构:每个子树本身也是一棵树。
  • 应用场景:文件系统、组织结构、数据库索引等。

二叉树的定义与类型

1. 什么是二叉树?

  • 二叉树:每个节点最多有2个子节点(左子节点和右子节点)。
  • 特点
    • 子树有明确的左右之分。
    • 可以为空树(没有节点)。

2. 特殊二叉树类型

类型定义
满二叉树深度为k的二叉树有2^k - 1个节点,每层节点数达到最大值。
完全二叉树除最后一层外,其他层是满的,且最后一层节点从左到右连续(无中间空缺)。

二叉排序树(BST)

1. BST的定义

  • 性质
    1. 左子树所有节点的值 < 根节点的值。
    2. 右子树所有节点的值 > 根节点的值。
    3. 左右子树也是BST。

2. BST的优势

  • 高效查找:利用二分法思想,时间复杂度为O(log n)(平衡情况下)。

二叉树的遍历

1. 前序遍历(根→左→右)

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

示例:遍历顺序为 A → B → D → H → I → E → J → C → F → G

2. 中序遍历(左→根→右)

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

示例:遍历顺序为 H → D → I → B → J → E → A → F → C → G

3. 后序遍历(左→右→根)

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

示例:遍历顺序为 H → I → D → J → E → B → F → G → C → A


二叉树的操作

1. 创建二叉树

#include <stdlib.h>struct Node {int data;struct Node* left;struct Node* right;
};// 创建新节点
struct Node* createNode(int data) {struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));newNode->data = data;newNode->left = NULL;newNode->right = NULL;return newNode;
}

2. 插入节点(BST)

struct Node* insertBST(struct Node* root, int data) {if (root == NULL) {return createNode(data); // 创建新节点}if (data < root->data) {root->left = insertBST(root->left, data); // 插入左子树} else if (data > root->data) {root->right = insertBST(root->right, data); // 插入右子树}return root;
}

3. 查找节点(BST)

struct Node* searchBST(struct Node* root, int key) {if (root == NULL || root->data == key) {return root; // 找到节点或空树}if (key < root->data) {return searchBST(root->left, key); // 左子树查找} else {return searchBST(root->right, key); // 右子树查找}
}

4. 删除节点(BST)

struct Node* deleteNode(struct Node* root, int key) {if (root == NULL) return root;if (key < root->data) {root->left = deleteNode(root->left, key); // 左子树删除} else if (key > root->data) {root->right = deleteNode(root->right, key); // 右子树删除} else {// 找到目标节点if (root->left == NULL) {struct Node* temp = root->right;free(root);return temp;} else if (root->right == NULL) {struct Node* temp = root->left;free(root);return temp;}// 左右子树均存在,找右子树的最小节点替换struct Node* temp = root->right;while (temp->left != NULL) {temp = temp->left;}root->data = temp->data;root->right = deleteNode(root->right, temp->data);}return root;
}

总结

核心知识点

  1. 二叉树结构:每个节点最多两个子节点,分为左子树和右子树。
  2. 二叉排序树(BST):左小右大的特性,支持高效查找、插入和删除。
  3. 遍历方式
    • 前序:根→左→右
    • 中序:左→根→右
    • 后序:左→右→根
  4. 内存管理:使用malloc动态分配节点内存,用free释放内存。

注意事项

  • 平衡性:BST的性能依赖于树的平衡,极端情况下可能退化为链表(时间复杂度变为O(n))。
  • 递归操作:遍历和操作通常使用递归实现,需注意递归终止条件。

练习题

  1. 实现一个函数,计算二叉树的深度(高度)。
  2. 编写代码,判断一棵二叉树是否为二叉排序树(BST)。

http://www.ppmy.cn/server/171138.html

相关文章

OV-WATCH手表

硬件部分&#xff1a; 一、硬件选型 MCU选型 选择STM32F4411C1U6&#xff0c;因为它具备较大的ROM和RAM&#xff0c;能够运行FreeRTOS和VIGL。 显示屏 采用触摸显示屏&#xff0c;具体型号可在淘宝搜索。 电源部分 充电芯片&#xff1a;采用TP4056&#xff0c;用于3.7V锂电…

在Ubuntu系统上部署Dify(开源大语言模型应用开发平台)

在Ubuntu系统上部署Dify(开源大语言模型应用开发平台) 环境准备Dify部署接入本地模型(如Ollama)安装Ollama运行模型并接入Dify环境准备 系统要求 Ubuntu 20.04/22.04,建议CPU≥2核,内存≥4GB。安装Docker及Docker Compose:# 安装Docker sudo apt update sudo apt insta…

如何在系统之间实现通信?

在多台系统之间实现通信,需要根据具体场景(如实时性、数据量、安全性、网络环境)选择合适的通信协议和技术方案。以下是常见的通信方式及其实现方法,涵盖局域网、互联网、跨平台等场景: 一、通信协议选择 1. HTTP/REST API 适用场景:跨平台、请求-响应模式(如Web服务…

Protobuf

Protobuf&#xff08;Protocol Buffers&#xff09;是 Google 开发的一种语言中立、平台中立、可扩展的序列化数据格式&#xff0c;用于结构化数据的序列化和反序列化。它比传统的文本格式&#xff08;如 JSON 或 XML&#xff09;更高效&#xff0c;特别适合于需要处理大量数据…

大语言模型概念科普

大模型&#xff08;Large Model&#xff09;是指具有大规模参数和复杂计算结构的机器学习模型。 大语言模型&#xff08;Large Language Model&#xff09;&#xff1a;通常是具有大规模参数和计算能力的自然语言处理模型&#xff0c;例如ChatGPT、deepseek。这些模型可以通过…

蓝桥备赛(二)- C++输入输出(上)

一、getchar 和 putchar getchar() 和 putchar() 是属于 C 语言的库函数 &#xff0c;C是兼容 C 语言的&#xff0c;所以 C 中只要正确包 含头文件也可以正常使用这两个函数。 1.1 getchar() getchar - C Reference 函数原型如下&#xff1a; int getchar (void) ; 1 . getch…

使用快捷键高效管理 VSCode:提升工作效率,告别鼠标操作

如果你想提高工作效率&#xff0c;减少鼠标操作&#xff0c;掌握键盘快捷键是一个非常有效的方式。在编程过程中&#xff0c;熟练使用快捷键能够快速管理文件、标签页&#xff0c;节省时间并提升效率。比如&#xff0c;Ctrl P 和 Ctrl W 可以快速打开和关闭文件&#xff0c;而…

Visual Studio更新说明(关注:.NET+AI生产力)

Ver V0.0&#xff1a;Visual Studio 2022 v17.12更新:.NET9AI生产力 AI插件推荐 &#xff08;1&#xff09;腾讯云AI代码手&#xff08;内含了DeepSeek-R1&#xff09;&#xff0c;目前免费&#xff0c;但收费我也可能会买。 AI插件!推荐 &#xff08;1&#xff09;百度的…