给我写一个c++的线段树代码
时间: 2023-08-28 17:14:48 浏览: 120
### 回答1:
#include <stdio.h> struct Node
{
int key;
struct Node *left, *right;
}; // 新建节点
struct Node *newNode(int item)
{
struct Node *temp = (struct Node *)malloc(sizeof(struct Node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
} // 插入节点
struct Node* insert(struct Node* node, int key)
{
/* 如果节点为空,返回新建节点 */
if (node == NULL) return newNode(key); /* 否则,递归插入 */
if (key < node->key)
node->left = insert(node->left, key);
else if (key > node->key)
node->right = insert(node->right, key); /* 返回更新的节点 */
return node;
}
### 回答2:
以下是一个简单的C语言实现的线段树代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int start; // 节点表示的区间的起始位置
int end; // 节点表示的区间的结束位置
int sum; // 节点表示的区间的和
struct Node* left; // 左子节点指针
struct Node* right; // 右子节点指针
} Node;
// 创建节点
Node* createNode(int start, int end) {
Node* node = (Node*)malloc(sizeof(Node));
node->start = start;
node->end = end;
node->sum = 0;
node->left = NULL;
node->right = NULL;
return node;
}
// 构建线段树
Node* buildTree(int arr[], int start, int end) {
if (start > end) {
return NULL;
}
Node* node = createNode(start, end);
if (start == end) {
node->sum = arr[start];
} else {
int mid = (start + end) / 2;
node->left = buildTree(arr, start, mid);
node->right = buildTree(arr, mid + 1, end);
node->sum = node->left->sum + node->right->sum;
}
return node;
}
// 更新线段树中指定位置的值
void updateValue(Node* root, int index, int diff) {
if (root->start == root->end) {
root->sum += diff;
} else {
int mid = (root->start + root->end) / 2;
if (index <= mid) {
updateValue(root->left, index, diff);
} else {
updateValue(root->right, index, diff);
}
root->sum = root->left->sum + root->right->sum;
}
}
// 查询线段树中指定区间的和
int getSum(Node* root, int start, int end) {
if (start > root->end || end < root->start) {
return 0;
} else if (start <= root->start && end >= root->end) {
return root->sum;
} else {
return getSum(root->left, start, end) + getSum(root->right, start, end);
}
}
int main() {
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int n = sizeof(arr) / sizeof(arr[0]);
Node* root = buildTree(arr, 0, n - 1);
printf("线段树中整个数组的和为:%d\n", root->sum);
int index = 3;
int newValue = 10;
int diff = newValue - arr[index];
arr[index] = newValue;
updateValue(root, index, diff);
printf("将位置 %d 的值更新为 %d,更新后线段树中整个数组的和为:%d\n", index, newValue, root->sum);
int start = 1;
int end = 6;
int sum = getSum(root, start, end);
printf("线段树中区间 [%d, %d] 的和为:%d\n", start, end, sum);
return 0;
}
```
这段代码实现了一个简单的线段树,使用数组 `{1, 2, 3, 4, 5, 6, 7, 8, 9}` 构建线段树,并进行了一些更新和查询操作。线段树是一种用于高效进行区间操作的数据结构,它可以在 O(logN) 的时间内完成一次区间操作(如求和、更新等)。以上述代码为例,构建了一个能够求整个数组和、更新具体位置值、求某个区间和的线段树。
### 回答3:
下面是一个简单的C语言线段树的实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
struct node {
int start; // 当前节点的起始位置
int end; // 当前节点的结束位置
int sum; // 当前节点的数据(可以是区间和、最大值等等)
struct node *left; // 左子节点
struct node *right; // 右子节点
};
// 创建线段树节点
struct node* createNode(int start, int end) {
struct node* newNode = (struct node*)malloc(sizeof(struct node));
newNode->start = start;
newNode->end = end;
newNode->sum = 0;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 构建线段树
struct node* buildTree(int arr[], int start, int end) {
if (start == end) {
struct node* leaf = createNode(start, end);
leaf->sum = arr[start];
return leaf;
}
struct node* root = createNode(start, end);
int mid = (start + end) / 2;
root->left = buildTree(arr, start, mid);
root->right = buildTree(arr, mid + 1, end);
root->sum = root->left->sum + root->right->sum;
return root;
}
// 更新线段树中某个节点的值
void updateNode(struct node* root, int index, int value) {
if (root->start == root->end) {
root->sum = value;
return;
}
int mid = (root->start + root->end) / 2;
if (index <= mid) {
updateNode(root->left, index, value);
} else {
updateNode(root->right, index, value);
}
root->sum = root->left->sum + root->right->sum;
}
// 查询线段树中某个区间的结果(比如区间和)
int queryRange(struct node* root, int start, int end) {
if (root->start == start && root->end == end) {
return root->sum;
}
int mid = (root->start + root->end) / 2;
if (end <= mid) {
return queryRange(root->left, start, end);
} else if (start > mid) {
return queryRange(root->right, start, end);
} else {
return queryRange(root->left, start, mid) + queryRange(root->right, mid + 1, end);
}
}
int main() {
int arr[] = {1, 3, 5, 7, 9, 11}; // 假设原始数组
int n = sizeof(arr) / sizeof(arr[0]);
struct node* root = buildTree(arr, 0, n - 1);
printf("区间和 [1, 3] 是:%d\n", queryRange(root, 1, 3)); // 输出区间和
updateNode(root, 2, 6); // 更新节点值
printf("区间和 [1, 3] 更新后是:%d\n", queryRange(root, 1, 3)); // 输出更新后的区间和
return 0;
}
```
这段代码实现了一个简单的线段树,用于求解区间和。可以通过 `buildTree` 函数构建线段树,通过 `updateNode` 函数更新某个节点的值,通过 `queryRange` 函数查询某个区间的结果。本示例中假设原始数组为 `{1, 3, 5, 7, 9, 11}`,并对线段树进行了一次更新和查询操作。
阅读全文