用c++写一下动态树的模板
时间: 2023-08-31 09:36:22 浏览: 56
### 回答1:
我可以用C语言编写一个简单的动态树模板:#include <stdio.h>
#include <stdlib.h>typedef struct TreeNode {
int data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode; TreeNode *createNode(int data) {
TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode));
node->data = data;
node->left = NULL;
node->right = NULL;
return(node);
} TreeNode *insert(TreeNode *node, int data) {
if (node == NULL)
return(createNode(data));
else {
if (data <= node->data)
node->left = insert(node->left, data);
else
node->right = insert(node->right, data);
}
return node;
} int main() {
TreeNode *root = NULL;
root = insert(root, 10);
insert(root, 20);
insert(root, 30);
insert(root, 40);
insert(root, 50);
return 0;
}
### 回答2:
动态树是一种动态数据结构,常用于解决一些树相关的问题,它允许我们在树上进行多种操作,如插入、删除、合并等。下面是C语言写的动态树模板:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义动态树的节点结构
typedef struct Node {
int val; // 节点的值
struct Node *left; // 左子节点指针
struct Node *right; // 右子节点指针
} Node;
// 初始化动态树
Node* init() {
return NULL;
}
// 向动态树中插入一个节点
void insert(Node **root, int val) {
if (*root == NULL) {
*root = (Node *)malloc(sizeof(Node));
(*root)->val = val;
(*root)->left = NULL;
(*root)->right = NULL;
} else if (val < (*root)->val) {
insert(&(*root)->left, val);
} else {
insert(&(*root)->right, val);
}
}
// 从动态树中删除一个节点
Node* remove(Node *root, int val) {
if (root == NULL) {
return NULL;
}
if (val < root->val) {
root->left = remove(root->left, val);
} else if (val > root->val) {
root->right = remove(root->right, val);
} else {
if (root->left == NULL) {
Node *tmp = root->right;
free(root);
return tmp;
} else if (root->right == NULL) {
Node *tmp = root->left;
free(root);
return tmp;
}
Node *tmp = findMin(root->right);
root->val = tmp->val;
root->right = remove(root->right, tmp->val);
}
return root;
}
// 在动态树中查找最小值
Node* findMin(Node *root) {
if (root == NULL) {
return NULL;
}
if (root->left == NULL) {
return root;
} else {
return findMin(root->left);
}
}
// 在动态树中查找某个节点
Node* find(Node *root, int val) {
if (root == NULL) {
return NULL;
}
if (val < root->val) {
return find(root->left, val);
} else if (val > root->val) {
return find(root->right, val);
} else {
return root;
}
}
// 销毁动态树
void destroy(Node *root) {
if (root != NULL) {
destroy(root->left);
destroy(root->right);
free(root);
}
}
int main() {
Node *root = init();
// 向动态树中插入节点
insert(&root, 5);
insert(&root, 3);
insert(&root, 7);
insert(&root, 2);
insert(&root, 4);
// 从动态树中删除节点
root = remove(root, 5);
// 在动态树中查找节点
Node *node = find(root, 4);
if (node != NULL) {
printf("找到节点:%d\n", node->val);
} else {
printf("未找到节点:%d\n", 4);
}
// 销毁动态树
destroy(root);
return 0;
}
```
这个动态树模板包含了动态树的常用操作,包括初始化、插入、删除、查找、查找最小值、销毁等。示例中我们初始化了一个动态树,插入了几个节点,然后删除了一个节点,最后查找了一个节点。需要注意的是,这只是一个简单的示例,实际应用时,可能需要根据具体问题进行相应的修改和扩展。
### 回答3:
动态树是一种动态数据结构,其主要用途是在树上进行合并和拆分操作。下面是一个用C语言编写的动态树模板:
```c
#include <stdio.h>
#include <stdlib.h>
struct Node {
int val;
struct Node* parent;
struct Node* left_child;
struct Node* right_child;
};
// 创建一个新节点
struct Node* createNode(int val) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->val = val;
newNode->parent = NULL;
newNode->left_child = NULL;
newNode->right_child = NULL;
return newNode;
}
// 查找根节点
struct Node* findRoot(struct Node* node) {
if (node->parent == NULL) {
return node;
}
return findRoot(node->parent);
}
// 进行合并操作
void merge(struct Node* node1, struct Node* node2) {
struct Node* root1 = findRoot(node1);
struct Node* root2 = findRoot(node2);
root1->parent = root2;
}
// 进行拆分操作
void split(struct Node* node) {
struct Node* parent = node->parent;
if (parent == NULL) {
return;
}
// 如果是左孩子
if (node == parent->left_child) {
parent->left_child = NULL;
}
// 如果是右孩子
else if (node == parent->right_child) {
parent->right_child = NULL;
}
node->parent = NULL;
}
int main() {
// 创建节点
struct Node* node1 = createNode(1);
struct Node* node2 = createNode(2);
struct Node* node3 = createNode(3);
// 进行合并操作
merge(node1, node2);
merge(node2, node3);
// 进行拆分操作
split(node2);
return 0;
}
```
这个动态树模板包含了创建新节点、查找根节点和合并、拆分操作的实现。在主函数里,首先创建了三个节点,并进行了合并操作,然后进行了拆分操作。这个模板可以用于实际的动态树问题中。