C语言实现二叉树的数据结构入门

需积分: 5 0 下载量 196 浏览量 更新于2024-12-18 收藏 7KB ZIP 举报
资源摘要信息:"在计算机科学中,二叉树是一种基础的数据结构,它由节点组成,每个节点包含数据以及最多两个子节点,通常称为左子节点和右子节点。二叉树被广泛应用于许多算法中,尤其是在搜索和排序算法中。在C语言中,二叉树的实现通常涉及到结构体的定义以及递归或循环的使用来遍历、插入、删除和搜索节点。 在C语言中,实现二叉树需要定义一个结构体来表示树中的节点,通常这个结构体会包含以下几个字段: 1. 数据字段,用于存储节点的值。 2. 指针字段,指向左子节点和右子节点。 例如,一个简单的二叉树节点定义可能如下所示: ```c typedef struct binary_tree_node { int data; // 节点存储的数据 struct binary_tree_node *left; // 指向左子节点的指针 struct binary_tree_node *right; // 指向右子节点的指针 } binary_tree_node_t; ``` 二叉树的类型定义后,可以创建和操作二叉树,常见的操作包括: - 插入(Insertion):将新节点添加到树中的适当位置。 - 删除(Deletion):从树中移除一个节点。 - 搜索(Search):查找树中是否存在具有特定值的节点。 - 遍历(Traversal):访问树中的每个节点,通常有三种遍历方式:前序(Pre-order)、中序(In-order)、后序(Post-order)遍历。 - 层序遍历(Level-order Traversal):按层次顺序访问树中的节点。 在实际应用中,二叉树有很多变种,例如二叉搜索树(BST)、平衡二叉树(如AVL树和红黑树)、堆( Heap)等,每种变体都有其特定的性质和用途。 二叉树的操作通常需要用到递归算法,这是因为二叉树的结构天然适合递归处理。然而,在某些情况下,也可以使用迭代方法来处理二叉树,特别是在处理非常大的树或优化性能时。 在了解二叉树的过程中,还需要注意几个关键概念: - 完全二叉树(Complete Binary Tree):除了最后一层外,每一层都被完全填满,并且所有节点都向左对齐。 - 满二叉树(Full Binary Tree):每一个节点都有0个或2个子节点。 - 完美二叉树(Perfect Binary Tree):所有的内部节点都有两个子节点,所有叶子节点都在同一层上。 在C语言中,操作二叉树涉及到指针的管理,例如分配内存、释放内存等,因此需要特别注意内存泄漏和指针悬挂等问题。良好的内存管理对于确保程序的稳定性和效率至关重要。 此外,C语言本身不提供垃圾回收机制,因此开发者需要手动管理分配给二叉树节点的内存。在节点被移除后,需要确保释放其占用的内存资源,避免内存泄漏。 根据给出的文件信息,可以推断这是一个关于C语言实现二叉树的数据结构的教程或参考资源。文件名称"binary_trees-master"暗示这是一个可能包含示例代码、练习和可能的项目文件的仓库或代码库,其中"master"可能表示这是主分支的代码。这将是一个非常好的学习资源,特别是对于那些希望加深对C语言和数据结构理解的学习者和开发者。"0x1D"可能是一个版本号或特定的内容标记,但在没有更多信息的情况下,它的具体含义尚不明确。"启动自述文件"可能意味着该资源中包含了一个README文件,这个文件通常会为用户介绍如何开始使用该资源,包括如何编译、运行代码以及如何进行项目配置等基础指导。"

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))

2023-05-05 上传