C语言实现二叉树核心操作原理与应用

需积分: 5 0 下载量 195 浏览量 更新于2025-01-04 收藏 7KB ZIP 举报
资源摘要信息:"在计算机科学中,二叉树是一种重要的数据结构,通常用于实现高效的搜索和排序算法。本资源提供了一个以C语言编写的二叉树实现,包括一系列二叉树的基础操作和应用实例。 标题 "binary_trees" 指明了文件内容的主题是关于二叉树的,而描述中的 "自述文件" 则表明该文件可能包含了对如何使用或理解这个二叉树实现的说明。 标签 "C" 表明这个二叉树实现是用C语言编写的。C语言以其高效和接近硬件操作的特性,常被用于系统编程和数据结构的实现。由于其指针操作的灵活性,C语言非常适合用来实现二叉树这样的复杂数据结构。 压缩包子文件的文件名称列表包含 "binary_trees-main",这可能表示该文件是整个二叉树实现项目的主文件或者是项目的入口点。在这样的项目中,"main" 文件通常包含了程序的主函数(main function),是程序开始执行的地方。 在详细分析二叉树的实现之前,让我们先了解一下二叉树的基础概念。二叉树是一种特殊类型的树形结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树在很多算法中都有应用,如二叉搜索树(Binary Search Trees),堆(Heaps),表达式树(Expression Trees)等。 对于C语言实现的二叉树,主要的知识点包括: 1. 结构体定义:在C中实现二叉树通常需要定义一个结构体来表示树的节点,结构体中至少包含数据域和两个指向其子节点的指针域。 2. 创建节点:需要有一个函数来创建新的节点,通常涉及到动态内存分配(使用malloc或calloc)。 3. 插入和删除:对于特定类型的二叉树(如二叉搜索树),需要实现插入和删除操作,确保树的特定属性(如二叉搜索树的左子节点值小于父节点,右子节点值大于父节点)。 4. 遍历:包括前序遍历(Pre-order)、中序遍历(In-order)、后序遍历(Post-order)和层次遍历(Level-order)。每种遍历方式都有其特定的应用场景和目的。 5. 搜索:在二叉搜索树中搜索特定元素时,可以根据树的性质来快速定位元素。 6. 清理资源:当不再需要二叉树时,需要有一个函数来释放分配给树节点的内存资源,避免内存泄漏。 7. 查找最大值和最小值:在二叉搜索树中,通常需要快速找到树中的最大值或最小值。 8. 树的高度和深度:计算二叉树的高度或深度是衡量树结构复杂性的一个重要指标。 9. 平衡二叉树(AVL树)或红黑树:如果项目包含了这些高级二叉树的实现,那么还需要掌握它们的旋转操作和平衡因子的概念。 10. 完整的项目结构:了解整个项目如何组织代码,例如将数据结构定义、功能实现、测试用例和主函数等功能分离到不同的文件中。 本资源中的 "binary_trees-main" 文件可能包含了项目的主函数和其他一些关键的项目设置,如包含必要的头文件,链接相关的库等。用户可以根据这个文件来编译和运行整个二叉树项目,体验二叉树操作的各种功能。 对于任何一个使用C语言进行数据结构和算法学习的人而言,理解和实现一个二叉树都是基础且关键的技能。通过本资源,学习者可以加深对二叉树数据结构的理解,并通过实践来巩固其在程序中的应用。"

for i in range(n_trees): # 随机采样训练集 idx = np.random.choice(X_train.shape[0], size=X_train.shape[0], replace=True) X_sampled = X_train[idx, :] y_sampled = y_train[idx] # 模糊化特征值 X_fuzzy = [] for j in range(X_sampled.shape[1]): if np.median(X_sampled[:, j])> np.mean(X_sampled[:, j]): fuzzy_vals = fuzz.trapmf(X_sampled[:, j], [np.min(X_sampled[:, j]), np.mean(X_sampled[:, j]), np.median(X_sampled[:, j]), np.max(X_sampled[:, j])]) else: fuzzy_vals = fuzz.trapmf(X_sampled[:, j], [np.min(X_sampled[:, j]), np.median(X_sampled[:, j]), np.mean(X_sampled[:, j]), np.max(X_sampled[:, j])]) X_fuzzy.append(fuzzy_vals) X_fuzzy = np.array(X_fuzzy).T # 训练决策树 tree = RandomForestClassifier(n_estimators=1, max_depth=max_depth) tree.fit(X_fuzzy, y_sampled) forest.append(tree) # 创建并编译深度神经网络 inputs = keras.Input(shape=(X_train.shape[1],)) x = keras.layers.Dense(64, activation="relu")(inputs) x = keras.layers.Dense(32, activation="relu")(x) outputs = keras.layers.Dense(1, activation="sigmoid")(x) model = keras.Model(inputs=inputs, outputs=outputs) model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"]) # 使用深度神经网络对每个决策树的输出进行加权平均 y_pred = np.zeros(y_train.shape[0]) for tree in forest: a = [] for j in range(X_train.shape[1]): if np.median(X_train[:, j]) > np.mean(X_train[:, j]): fuzzy_vals = fuzz.trapmf(X_train[:, j], [np.min(X_train[:, j]), np.mean(X_train[:, j]), np.median(X_train[:, j]), np.max(X_train[:, j])]) else: fuzzy_vals = fuzz.trapmf(X_train[:, j], [np.min(X_train[:, j]), np.median(X_train[:, j]), np.mean(X_train[:, j]), np.max(X_train[:, j])]) a.append(fuzzy_vals) fuzzy_vals = np.array(a).T y_proba = tree.predict_proba(fuzzy_vals) # 将概率转换为类别标签 y_tree = np.argmax(y_proba, axis=1) y_pred += y_tree改成三分类

2023-05-05 上传

改成三分类预测代码n_trees = 100 max_depth = 10 forest = [] for i in range(n_trees): idx = np.random.choice(X_train.shape[0], size=X_train.shape[0], replace=True) X_sampled = X_train[idx, :] y_sampled = y_train[idx] X_fuzzy = [] for j in range(X_sampled.shape[1]): if np.median(X_sampled[:, j])> np.mean(X_sampled[:, j]): fuzzy_vals = fuzz.trapmf(X_sampled[:, j], [np.min(X_sampled[:, j]), np.mean(X_sampled[:, j]), np.median(X_sampled[:, j]), np.max(X_sampled[:, j])]) else: fuzzy_vals = fuzz.trapmf(X_sampled[:, j], [np.min(X_sampled[:, j]), np.median(X_sampled[:, j]), np.mean(X_sampled[:, j]), np.max(X_sampled[:, j])]) X_fuzzy.append(fuzzy_vals) X_fuzzy = np.array(X_fuzzy).T tree = RandomForestClassifier(n_estimators=1, max_depth=max_depth) tree.fit(X_fuzzy, y_sampled) forest.append(tree) inputs = keras.Input(shape=(X_train.shape[1],)) x = keras.layers.Dense(64, activation="relu")(inputs) x = keras.layers.Dense(32, activation="relu")(x) outputs = keras.layers.Dense(1, activation="sigmoid")(x) model = keras.Model(inputs=inputs, outputs=outputs) model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"]) y_pred = np.zeros(y_train.shape) for tree in forest: a = [] for j in range(X_train.shape[1]): if np.median(X_train[:, j]) > np.mean(X_train[:, j]): fuzzy_vals = fuzz.trapmf(X_train[:, j], [np.min(X_train[:, j]), np.mean(X_train[:, j]), np.median(X_train[:, j]), np.max(X_train[:, j])]) else: fuzzy_vals = fuzz.trapmf(X_train[:, j], [np.min(X_train[:, j]), np.median(X_train[:, j]), np.mean(X_train[:, j]), np.max(X_train[:, j])]) a.append(fuzzy_vals) fuzzy_vals = np.array(a).T y_pred += tree.predict_proba(fuzzy_vals)[:, 1] y_pred /= n_trees model.fit(X_train, y_pred, epochs=10, batch_size=32) y_pred = model.predict(X_test) mse = mean_squared_error(y_test, y_pred) rmse = math.sqrt(mse) print('RMSE:', rmse) print('Accuracy:', accuracy_score(y_test, y_pred))

127 浏览量