一、二叉树介绍
二叉树(Binary Tree)是一种重要的数据结构,它在计算机科学和编程中经常被用到。它是一种层次结构,由节点(Node)组成,每个节点可以有零个、一个或两个子节点
- 节点(Node):二叉树的基本构建块。每个节点包含一个数据元素,以及指向左子节点和右子节点的指针。节点的数据可以是任何类型,通常是整数或其他自定义类型。
- 根节点(Root Node):二叉树的顶部节点,它没有父节点。它是整个树的起点。
- 子节点(Child Node):每个节点可以有零、一个或两个子节点。左子节点和右子节点分别代表左侧和右侧的子树。
- 叶子节点(Leaf Node):没有子节点的节点称为叶子节点。它们位于树的底部,即没有子树的节点。
- 父节点(Parent Node):每个节点都可以有一个父节点,它是直接连接到当前节点的节点。
- 深度(Depth):节点在树中的层次。根节点的深度为0,其子节点的深度为1,以此类推。
- 高度(Height):树中的最大深度。根节点到叶子节点的最长路径的深度称为树的高度。
- 二叉树的类型:根据节点的子节点数目,二叉树可以分为多种类型,包括二叉搜索树(Binary Search Tree,BST)、平衡二叉树(Balanced Binary Tree)、满二叉树(Full Binary Tree)、完全二叉树(Complete Binary Tree)等。
- 遍历(Traversal):遍历是指按照特定顺序访问树的所有节点。常见的遍历方法包括前序遍历(Preorder Traversal)、中序遍历(Inorder Traversal)、后序遍历(Postorder Traversal)以及层次遍历(Level Order Traversal)。
二、使用步骤
代码如下(示例):
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport warningswarnings.filterwarnings('ignore')importsslssl._create_default_https_context = ssl._create_unverified_context
2.读入数据
代码如下(示例):
#include #include // 二叉树节点的结构定义typedef struct TreeNode {int data;struct TreeNode* left;struct TreeNode* right;} TreeNode;// 创建一个新的二叉树节点TreeNode* createNode(int value) {TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));if (newNode == NULL) {fprintf(stderr, "内存分配失败\n");exit(1);}newNode->data = value;newNode->left = NULL;newNode->right = NULL;return newNode;}// 插入节点到二叉树TreeNode* insert(TreeNode* root, int value) {if (root == NULL) {return createNode(value);}if (value < root->data) {root->left = insert(root->left, value);} else if (value > root->data) {root->right = insert(root->right, value);}return root;}// 前序遍历二叉树void preorderTraversal(TreeNode* root) {if (root != NULL) {printf("%d ", root->data); // 先访问当前节点的值preorderTraversal(root->left); // 递归遍历左子树preorderTraversal(root->right); // 递归遍历右子树}}// 中序遍历二叉树void inorderTraversal(TreeNode* root) {if (root != NULL) {inorderTraversal(root->left); // 递归遍历左子树printf("%d ", root->data); // 访问当前节点的值inorderTraversal(root->right); // 递归遍历右子树}}// 后序遍历二叉树void postorderTraversal(TreeNode* root) {if (root != NULL) {postorderTraversal(root->left); // 递归遍历左子树postorderTraversal(root->right); // 递归遍历右子树printf("%d ", root->data); // 最后访问当前节点的值}}// 销毁二叉树void destroyTree(TreeNode* root) {if (root != NULL) {destroyTree(root->left); // 递归销毁左子树destroyTree(root->right); // 递归销毁右子树free(root); // 释放当前节点的内存}}int main() {TreeNode* root = NULL;// 插入节点到二叉树root = insert(root, 5);root = insert(root, 3);root = insert(root, 8);root = insert(root, 1);root = insert(root, 4);root = insert(root, 7);root = insert(root, 9);printf("前序遍历结果: ");preorderTraversal(root);printf("\n");printf("中序遍历结果: ");inorderTraversal(root);printf("\n");printf("后序遍历结果: ");postorderTraversal(root);printf("\n");// 销毁二叉树,释放内存destroyTree(root);return 0;}
输出结果:前序遍历结果: 5 3 1 4 8 7 9中序遍历结果: 1 3 4 5 7 8 9后序遍历结果: 1 4 3 7 9 8 5