树——用二叉树构建线段树
2015-10-06 22:27
197 查看
上一博文线段树问题中,用数组表示线段树,成功AC了,本文用二叉树表示线段树,复习一下二叉树,不过下面这段用二叉树代码表示的线段树是无法AC的,因为这个代码的空间复杂度远高于上一个用结构体数组表示的空间复杂度。
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<list>
#include<iterator>
#include<string>
#include<stack>
using namespace std;
#define INF 0x3fffffff
struct NODE {
int left, right, value;
};
struct Tree {
NODE node;
Tree *left, *right;
};
class SegTree {
public:
SegTree() {
}
~SegTree() {
}
void Build(Tree *t,int n,int left,int right);
int Find(Tree *t, int n, int begin, int end);
void Update(Tree *t, int n, int ind, int val);
void Destory(Tree *t);
};
void SegTree::Build(Tree *t, int n, int left,int right){
t->node.left = left;
t->node.right = right;
if (left == right)
{
scanf("%d", &t->node.value);
return;
}
int mid = (left + right) >> 1;
t->left = new Tree();
Build(t->left,n << 1, left, mid);
t->right = new Tree();
Build(t->right,(n << 1) + 1, mid + 1, right);
t->node.value = min(t->left->node.value, t->right->node.value);
}
int SegTree::Find(Tree *t,int n, int begin, int end) {
int p1 = INF, p2 = INF;
if (t->node.left >= begin&&t->node.right <= end)
return t->node.value;
if (begin <= t->left->node.right)
p1 = Find(t->left,n << 1, begin, end);
if (end >= t->right->node.left)
p2 = Find(t->right,(n << 1) + 1, begin, end);
return min(p1, p2);
}
void SegTree::Update(Tree *t,int n, int ind, int val) {
if (t->node.left == t->node.right)
{
t->node.value = val;
}
else
{
if (ind <= t->left->node.right)
Update(t->left,n << 1, ind, val);
if (ind >= t->right->node.left)
Update(t->right,(n << 1) + 1, ind, val);
t->node.value = min(t->left->node.value, t->right->node.value);
}
}
void SegTree::Destory(Tree *t) {
Destory(t->left);
Destory(t->right);
delete t;
t = NULL;
}
int main()
{
int N;
int m;
int s, l, r;
SegTree st;
Tree *t = new Tree();
while (~scanf("%d", &N))
{
st.Build(t,1, 0, N - 1);
scanf("%d", &m);
for (int i = 0; i < m; i++)
{
scanf("%d %d %d", &s, &l, &r);
if (s == 0)
printf("%d\n", st.Find(t,1, l - 1, r - 1));
if (s == 1)
st.Update(t,1, l - 1, r);
}
}
st.Destory(t);
return 0;
}
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<list>
#include<iterator>
#include<string>
#include<stack>
using namespace std;
#define INF 0x3fffffff
struct NODE {
int left, right, value;
};
struct Tree {
NODE node;
Tree *left, *right;
};
class SegTree {
public:
SegTree() {
}
~SegTree() {
}
void Build(Tree *t,int n,int left,int right);
int Find(Tree *t, int n, int begin, int end);
void Update(Tree *t, int n, int ind, int val);
void Destory(Tree *t);
};
void SegTree::Build(Tree *t, int n, int left,int right){
t->node.left = left;
t->node.right = right;
if (left == right)
{
scanf("%d", &t->node.value);
return;
}
int mid = (left + right) >> 1;
t->left = new Tree();
Build(t->left,n << 1, left, mid);
t->right = new Tree();
Build(t->right,(n << 1) + 1, mid + 1, right);
t->node.value = min(t->left->node.value, t->right->node.value);
}
int SegTree::Find(Tree *t,int n, int begin, int end) {
int p1 = INF, p2 = INF;
if (t->node.left >= begin&&t->node.right <= end)
return t->node.value;
if (begin <= t->left->node.right)
p1 = Find(t->left,n << 1, begin, end);
if (end >= t->right->node.left)
p2 = Find(t->right,(n << 1) + 1, begin, end);
return min(p1, p2);
}
void SegTree::Update(Tree *t,int n, int ind, int val) {
if (t->node.left == t->node.right)
{
t->node.value = val;
}
else
{
if (ind <= t->left->node.right)
Update(t->left,n << 1, ind, val);
if (ind >= t->right->node.left)
Update(t->right,(n << 1) + 1, ind, val);
t->node.value = min(t->left->node.value, t->right->node.value);
}
}
void SegTree::Destory(Tree *t) {
Destory(t->left);
Destory(t->right);
delete t;
t = NULL;
}
int main()
{
int N;
int m;
int s, l, r;
SegTree st;
Tree *t = new Tree();
while (~scanf("%d", &N))
{
st.Build(t,1, 0, N - 1);
scanf("%d", &m);
for (int i = 0; i < m; i++)
{
scanf("%d %d %d", &s, &l, &r);
if (s == 0)
printf("%d\n", st.Find(t,1, l - 1, r - 1));
if (s == 1)
st.Update(t,1, l - 1, r);
}
}
st.Destory(t);
return 0;
}
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- C++非递归队列实现二叉树的广度优先遍历
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- C#非递归先序遍历二叉树实例
- C++非递归建立二叉树实例
- C语言实现找出二叉树中某个值的所有路径的方法
- C++实现二叉树遍历序列的求解方法
- C语言实现二叉树遍历的迭代算法
- 用C语言判断一个二叉树是否为另一个的子结构
- C++实现二叉树非递归遍历方法实例总结
- C++二叉树结构的建立与基本操作
- 深入遍历二叉树的各种操作详解(非递归遍历)
- JavaScript数据结构和算法之二叉树详解
- java使用归并删除法删除二叉树中节点的方法
- Java中二叉树数据结构的实现示例
- python数据结构之二叉树的建立实例
- python数据结构树和二叉树简介
- python数据结构之二叉树的统计与转换实例