一、二叉树介绍
二叉树(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 np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2.读入数据
代码如下(示例):
#include <stdio.h>
#include <stdlib.h>
// 二叉树节点的结构定义
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