美文网首页
2020-05-28 线段树

2020-05-28 线段树

作者: JalorOo | 来源:发表于2020-05-28 22:53 被阅读0次
//
//  main.cpp
//  数据结构
//
//  Created by Jalor on 2020/5/28.
//  Copyright © 2020 Jalor. All rights reserved.
//

#include <iostream>
#include <cstdio>
using namespace std;

struct Node{//结构体
    int L;
    int R;
    int val = 0;
};

void build_node_tree(int* arr, Node* tree,int node,int start,int end){//建树
    tree[node].L = start;
    tree[node].R = end;
    if (start == end) {
        tree[node].val = arr[start];
        return;
    }
    int mid = (start+end)/2;
    int left_node = node * 2 + 1;
    int right_node = node * 2 +2;
    build_node_tree(arr, tree, left_node, start, mid);
    build_node_tree(arr, tree, right_node, mid+1, end);
    tree[node].val = tree[left_node].val+tree[right_node].val;
}

void update_node_tree(int* arr, Node* tree, int node, int idx, int val){
    int start = tree[node].L;
    int end = tree[node].R;
    int mid = (start+end)/2;
    if (start == end) {
        tree[node].val = val;
        arr[start] = val;
        return;
    }
    int left_node = node * 2 + 1;
    int right_node = node * 2 +2;
    if (idx>=start && idx<=mid) {
        update_node_tree(arr, tree, left_node, idx, val);
    } else {
        update_node_tree(arr, tree, right_node, idx, val);
    }
    tree[node].val = tree[left_node].val+tree[right_node].val;
}

int query_node_tree(int* arr, Node* tree, int node, int L, int R){
    int start = tree[node].L;
    int end = tree[node].R;
    if (R < start || end<L) {
        return 0;
    }
    
    if (L<= start && end<=R) {
        return tree[node].val;
    }
    
    if (start == end) {
        return tree[node].val;
    }
    
    int left_node = node * 2 + 1;
    int right_node = node * 2 +2;
    
    return
    query_node_tree(arr, tree, left_node, L, R)
    + query_node_tree(arr, tree, right_node, L, R);
}

void build_tree(int* arr, int* tree,int node,int start,int end){//建树
    if (start == end) {
        tree[node] = arr[start];
        return;
    }
    int mid = (start+end)/2;
    int left_node = node * 2 + 1;
    int right_node = node * 2 + 2;
    build_tree(arr, tree, left_node, start, mid);
    build_tree(arr, tree, right_node, mid+1, end);
    tree[node] = tree[left_node]+tree[right_node];
}



int main() {
    int num[6]={1,3,5,7,9,11};
    int size = 6;
    int* tree = new int[20];
    Node* node_tree = new Node[20];
    memset(tree, 0, sizeof(int)*20);
    
    build_tree(num,tree,0,0,size-1);
    
    build_node_tree(num,node_tree,0,0,size-1);
    
    update_node_tree(num, node_tree, 0, 4, 6);
    for (int i = 0; i<15; i++) {
        printf("node_tree[%d] = %d\n",i,node_tree[i].val);
    }
    
    int n = query_node_tree(num, node_tree, 0, 0, 5);
    
    printf("%d",n);
    return 0;
}

相关文章

  • 2020-05-28 线段树

  • 算法模板(七) 线段树

    线段树单点操作 线段树区间操作

  • 数据结构-线段树

    实现一个线段树 下面实现的线段树,有三个功能: 把数组构建成一颗线段树 线段树的修改 线段树的查询 303号问题 ...

  • 线段树系列之——区间更新

    第三篇线段树了——重点不在于解决题目,通过题目理解线段树才是重点 前面写了一篇关于线段树的单点更新,线段树的单点更...

  • 线段树模板

    线段树 线段树基本概念 概述 线段树,类似区间树,是一个完全二叉树,它在各个节点保存一条线段(数组中的一段子数组)...

  • 线段树专题整理

    待更新 线段树讲解(未读)线段树模板(未读) 模板 求区间总和 A - 敌兵布阵 HDU - 1166 题意 线段...

  • 线段树 02 构建线段树

    构建线段树 线段树的每个节点除了天然的对应一段长度外,不一定赋予其上的意义就是区间元素的和,所以两个节点向上汇聚成...

  • 线段树(区间树)

    线段树:线段树是一种二叉树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。线段树适用于不变...

  • 线段树

    专题 B线段树求逆序对 C[] D 区间不同值求和

  • 线段树

    [toc] 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn。(2).线段树算...

网友评论

      本文标题:2020-05-28 线段树

      本文链接:https://www.haomeiwen.com/subject/nwzzahtx.html