树练习题

#include<stdio.h>
#include<stdlib.h>
typedef int value;
typedef struct btree
{
value data;
struct btree *lchild, *rchild;
int ltag, rtag;
struct btree*parent;
}*datatype,btree;
typedef struct node
{
datatype data;
struct node* next;
}node;
typedef struct stack
{
node *top;
}stack;
typedef struct queue
{
node*rear, *front;
}queue;
void init_stack(stack*&s)
{
s = (stack*)malloc(sizeof(stack));
s->top = NULL;
} v
oid push(stack*s,datatype data)
{
node*temp = (node*)malloc(sizeof(node));
temp->data = data;
temp->next = s->top;
s->top = temp;
} b
ool empty(stack*s)
{
if (s->top == NULL)
return true;
else
return false;
} d
atatype pop(stack*s)
{
if (!empty(s))
{
datatype temp = s->top->data;
s->top = s->top->next;
return temp;
} e
lse
printf("empty stack!\n");
} d
atatype gettop(stack*s)
{
if(!empty(s))
return s->top->data;
else
printf("empty stack!\n");
} v
oid init_queue(queue*&q)
{
q = (queue*)malloc(sizeof(queue));
q->front = q->rear = (node*)malloc(sizeof(node));
q->front->next = NULL;
} v
oid enqueue(queue *q, datatype data)
{
node *temp = (node*)malloc(sizeof(node));
temp->data = data;
q->rear->next = temp;
q->rear = q->rear->next;
} b
ool empty(queue*q)
{
return q->rear == q->front;
} d
atatype dequeue(queue*q)
{
if (empty(q))
printf("empty queue!\n");
else
{
datatype temp = q->front->next->data;
if (q->front->next == q->rear)
q->rear = q->front;
q->front->next = q->front->next->next;
return temp;
}
} d
atatype getfront(queue*q)
{
if (!empty(q))
return q->front->next->data;
else
printf("empty queue!\n");
}v
oid create_btree(btree*&b, value data[], int num)
{
int cnt = 0;
queue*q;
init_queue(q);
while(cnt<num)
{
cnt++;
btree*temp = NULL;
if (data[cnt - 1] != -1)
{
temp = (btree*)malloc(sizeof(btree));
temp->data = data[cnt - 1];
temp->lchild = NULL;
temp->rchild = NULL;
temp->ltag = 0;
temp->rtag = 0;
temp->parent = NULL;
}if
(cnt == 1)
b = temp;
if (!empty(q))
{
btree*parent = getfront(q);
if (temp != NULL&&parent!=NULL)
{
if (cnt % 2 == 0)
{
parent->lchild = temp;
parent->ltag = 1;
}e
lse
{
parent->rchild = temp;
parent->rtag = 1;
} t
emp->parent = parent;
} if
(cnt%2==1)
dequeue(q);
} e
nqueue(q, temp);
}
} v
oid pretraversal(btree*b)
{
btree* root = b;
stack *s;
init_stack(s);
while (root != NULL||!empty(s))
{
if (root == NULL)
root = pop(s)->rchild;
else
{
printf("%d ", root->data);
push(s, root);
root = root->lchild;
}
}
} v
oid intraversal(btree*b)
{ } v
oid posttraversal(btree *b)
{
btree*root = b;
stack*s, *tag;
init_stack(s);
init_stack(tag);
while (root != NULL || !empty(s))
{
if (root == NULL)
{
int tmp = (int)pop(tag);
if (tmp == 1)
{
push(tag, (datatype)2);
root = gettop(s)->rchild;
} e
lse if (tmp == 2)
{
root = pop(s);
printf("%d ", root->data);
root = NULL;
}
} e
lse
{
push(s, root);
push(tag, (datatype)1);
root = root->lchild;
}
}
} v
oid swap(btree*b)
{
if (b != NULL&&b->lchild != NULL&&b->rchild != NULL&&b->lchild->data > b->rchild->data)
{
btree*tmp = b->lchild;
b->lchild = b->rchild;
b->rchild = tmp;
}
} v
oid remove(btree*&b, value x)
{
btree*root = b;
stack*s, *tag;
init_stack(s);
init_stack(tag);
while (root != NULL || !empty(s))
{
if (root == NULL)
{
int tmp = (int)pop(tag);
if (tmp == 1)
{
push(tag, (datatype)2);
root = gettop(s)->rchild;
}
else if (tmp == 2)
{
root = pop(s);
if (root->data == x)
{
printf("delete:");
posttraversal(root);
printf("\n");
if (!empty(s))
if ((int)gettop(tag) == 1)
gettop(s)->lchild = NULL;
else
gettop(s)->rchild = NULL;
else
b = NULL;
} r
oot = NULL;
}
} e
lse
{
push(s, root);
push(tag, (datatype)1);
root = root->lchild;
}
}
} v
oid prethr(btree*b)
{
btree* root = b;
btree*pre = NULL;
stack *s;
init_stack(s);
while (root != NULL || !empty(s))
{
if (root == NULL)
{
root = pop(s);
if (root->rtag == 0)
root = NULL;
else
root = root->rchild;
}
else
{
if (root->ltag == 0)
root->lchild = pre;
if (pre != NULL&&pre->rtag == 0)
pre->rchild = root;
push(s, root);
pre = root;
if (root->ltag == 0)
root= NULL;
else
root = root->lchild;
}
}
} b
tree*getprenxt(btree*b)
{
if (b != NULL)
if (b->ltag == 0)
return b->rchild;
else
return b->lchild;
else return NULL;
} b
tree*getprefwd(btree*b)
{
if (b != NULL)
if (b->ltag == 0)
return b->lchild;
else if (b->parent != NULL)
if(b->parent->lchild == b || b->parent->ltag == 0)
return b->parent;
else
{
btree*tmp = b->parent->lchild;
while (tmp->rtag != 0)
tmp = tmp->rchild;
return tmp;
}
return NULL;
} v
oid inthr(btree*b)
{
btree*root = b;
stack*s;
init_stack(s);
btree*pre = NULL;
while (root != NULL || !empty(s))
{
if (root == NULL)
{
root = pop(s);
if (root->ltag == 0)
root->lchild = pre;
if (pre != NULL&&pre->rtag == 0)
pre->rchild = root;
pre = root;
if (root->rtag == 0)
root = NULL;
else
root = root->rchild;
}e
lse
{
push(s, root);
if (root->ltag == 0)
root = NULL;
else
root = root->lchild;
}
}
}b
tree*getinnxt(btree*b)
{
if (b != NULL)
if (b->rtag == 0)
return b->rchild;
else
{
btree*tmp = b->rchild;
while (tmp->ltag != 0)
tmp = tmp->lchild;
return tmp;
}
return NULL;
}b
tree*getinfwd(btree*b)
{
if (b != NULL)
if (b->ltag == 0)
return b->lchild;
else
{
btree*tmp = b->lchild;
while (tmp->rtag != 0)
tmp = tmp->rchild;
return tmp;
}
return NULL;
} v
oid postthr(btree*b)
{
btree*root = b;
stack*s, *tag;
init_stack(s);
init_stack(tag);
btree*pre = NULL;
while (root != NULL || !empty(s))
{
if (root == NULL)
{
int tmp = (int)pop(tag);
if (tmp == 1)
{
push(tag, (datatype)2);
root = gettop(s);
if (root->rtag == 0)
root = NULL;
else
root = root->rchild;
} e
lse if (tmp == 2)
{
root = pop(s);
if (root->ltag == 0)
root->lchild = pre;
if (pre != NULL&&pre->rtag == 0)
pre->rchild = root;
pre = root;
root = NULL;
}
}
else
{
push(s, root);
push(tag, (datatype)1);
if (root->ltag == 0)
root = NULL;
else
root = root->lchild;
}
}
} b
tree*getpostnxt(btree*b)
{
if (b != NULL)
if (b->rtag == 0)
return b->rchild;
else if (b->parent != NULL)
if (b->parent->rchild == b)
return b->parent;
else if (b->parent->rtag == 0)
return b->parent;
else
{
btree*tmp = b->parent->rchild;
while (tmp->ltag != 0)
tmp = tmp->lchild;
return tmp;
}
return NULL;
} b
tree*getpostfwd(btree*b)
{
if (b != NULL)
if (b->ltag == 0)
return b->lchild;
else if (b->ltag == 1)
return b->rchild;
else
return b->lchild;
return NULL;
} v
oid create_bst(btree*&b, value data[],int len)
{
b = NULL;
for (int i = 0; i < len; i++)
{
btree*tmpnode = (btree*)malloc(sizeof(btree));
tmpnode->data = data[i];
tmpnode->lchild = NULL;
tmpnode->ltag = 0;
tmpnode->parent = NULL;
tmpnode->rchild = NULL;
tmpnode->rtag = 0;
if (b != NULL)
{
btree*tmp = b;
btree*pre = NULL;
do
{
pre = tmp;
if (tmp->data > tmpnode->data)
tmp = tmp->lchild;
else
tmp = tmp->rchild;
} while (tmp != NULL);
if (pre->data > tmpnode->data)
pre->lchild = tmpnode;
else
pre->rchild = tmpnode;
} e
lse
b = tmpnode;
}
} v
oid free_btree(btree*b)
{
btree*root = b;
stack*s, *tag;
init_stack(s);
init_stack(tag);
while (root != NULL || !empty(s))
{
if (root == NULL)
{
int tmp = (int)pop(tag);
if (tmp == 1)
{
push(tag, (datatype)2);
root = gettop(s)->rchild;
}e
lse if (tmp == 2)
{
root = pop(s);
printf("%d ", root->data);
free(root);
root = NULL;
}
}e
lse
{
push(s, root);
push(tag, (datatype)1);
root = root->lchild;
}
}
}v
oid remove_bst_node(btree*&b, value x)
{
btree*pre = NULL;
btree*p = b;
while (p != NULL)
{
if (p->data < x)
{
pre = p;
p = p->rchild;
}e
lse if (p->data > x)
{
pre = p;
p = p->lchild;
}e
lse
{
if (pre != NULL)
{
btree*result=NULL;
if (p->lchild != NULL&&p->rchild==NULL)
{
result = p->lchild;
}e
lse if (p->lchild == NULL&&p->rchild != NULL)
{
result = p->rchild;
} e
lse if(p->lchild != NULL&&p->rchild != NULL)
{
btree*tmp = p->lchild, *father = p;
while (tmp->rchild != NULL)
{
father = tmp;
tmp = tmp->rchild;
} if
(father == p)
{
tmp->rchild = p->rchild;
result = tmp;
} e
lse
{
father->rchild = tmp->lchild;
tmp->lchild = p->lchild;
tmp->rchild = p->rchild;
result = tmp;
}
} if
(pre->lchild == p)
pre->lchild =result;
else
pre->rchild = result;
free(p);
} e
lse {
free(b);
b = NULL;
break;
}
break;
}
}
} b
ool is_bst(btree*b)
{
btree*root = b;
stack*s;
init_stack(s);
while (root != NULL || !empty(s))
{
if (root == NULL)
{
root = pop(s);
// printf("%d ", root->data);
if (root->lchild != NULL)
if (root->lchild->data > root->data)
return false;
if (root->rchild != NULL)
if (root->rchild->data < root->data)
return false;
root = root->rchild;
} e
lse
{
push(s, root);
root = root->lchild;
}
} r
eturn true;
} i
nt main()
{
value test[] = {1,2,3,4,5,6,7,8,9,10};
btree *b=NULL;
create_btree(b, test, 10);
printf("%d", is_bst(b));
getchar();
}

MATLAB主动噪声和振动控制算法&mdash;&mdash;对较大的次级路径变化具有鲁棒性内容概要:本文主要介绍了一种在MATLAB环境下实现的主动噪声和振动控制算法,该算法针对较大的次级路径变化具有较强的鲁棒性。文中详细阐述了算法的设计原理与实现方法,重点解决了传统控制系统中因次级路径动态变化导致性能下降的问题。通过引入自适应机制和鲁棒控制策略,提升了系统在复杂环境下的稳定性和控制精度,适用于需要高精度噪声与振动抑制的实际工程场景。此外,文档还列举了多个MATLAB仿真实例及相关科研技术服务内容,涵盖信号处理、智能优化、机器学习等多个交叉领域。; 适合人群:具备一定MATLAB编程基础和控制系统理论知识的科研人员及工程技术人员,尤其适合从事噪声与振动控制、信号处理、自动化等相关领域的研究生和工程师。; 使用场景及目标:①应用于汽车、航空航天、精密仪器等对噪声和振动敏感的工业领域;②用于提升现有主动控制系统对参数变化的适应能力;③为相关科研项目提供算法验证与仿真平台支持; 阅读建议:建议读者结合提供的MATLAB代码进行仿真实验,深入理解算法在不同次级路径条件下的响应特性,并可通过调整控制参数进一步探究其鲁棒性边界。同时可参考文档中列出的相关技术案例拓展应用场景。
<think>根据用户需求,用户希望寻找洛谷平台上适合练习的线段相关经典练习题。结合引用内容,我们可以提取出一些经典的线段题目。 引用[1]提到了洛谷P2824(排序),该题可以通过线段分裂合并+set或者二分答案+线段来解决,是一道经典题目。 引用[2]中提到了洛谷P1502(窗口的星星),是一道经典的扫描线问题(通常用线段实现)。 引用[3]提到了一道分块练习题(但用户要求线段),所以我们可以忽略分块,但其中提到线段状数组过不了,说明该题可能设计为分块,所以不推荐。 引用[4]中提到了hdu1542(Atlantis,扫描线法)以及一道线段练习题(未给出题号,但代码是线段实现的海报张贴问题,类似于洛谷P5490【模板】扫描线)。 此外,根据洛谷常见的线段经典题,我们还可以补充一些: 1. 洛谷P3372 【模板】线段1 - 区间修改(加法)、区间查询(求和) 2. 洛谷P3373 【模板】线段2 - 区间修改(加法、乘法)、区间查询(求和) 3. 洛谷P5490 【模板】扫描线 - 矩形面积并(Atlantis问题) 4. 洛谷P2572 [SCOI2010]序列操作 - 多种区间操作(赋值、取反、求和、求连续1的个数) 5. 洛谷P1471 方差 - 维护区间和与区间平方和 6. 洛谷P1531 I Hate It - 区间最值、单点修改(较简单) 结合引用中提到的题目,我们重点推荐: 1. 洛谷P2824 [HEOI2016/TJOI2016]排序(引用[1]) 题目大意:给出一个1到n的全排列,现在进行m次局部排序,排序分为两种:(1)将区间[l,r]升序排序;(2)将区间[l,r]降序排序。最后询问第q位置上的数。 解题方法:二分答案+线段 或 线段分裂合并(较难)。该题是线段应用的经典题目,可以锻炼对线段的灵活运用。 2. 洛谷P1502 窗口的星星(引用[2]) 题目大意:平面上有n颗星星,每颗星星有一个亮度。用一个宽为W、高为H的矩形去框星星,求矩形能框住的星星的亮度之和的最大值(边框上的星星不算)。 解题方法:扫描线+线段。该题是经典的扫描线问题,需要将问题转化为区间操作,并用线段维护最大值。 3. 洛谷P5490 【模板】扫描线(引用[4]中hdu1542的同类型题,在洛谷上为P5490) 题目大意:求n个矩形的面积并。 解题方法:扫描线+线段。这是扫描线最基础的应用,适合学习扫描线算法。 4. 洛谷P2572 [SCOI2010]序列操作 题目大意:对一个01序列进行5种操作:区间置0、区间置1、区间取反、区间求和、区间求连续1的个数。 解题方法:线段维护多个标记(覆盖标记、取反标记)和复杂信息(连续段)。这题对线段的能力提升很大。 5. 洛谷P3373 【模板】线段2 题目大意:区间乘、区间加、区间求和。线段处理两种区间修改的模板题。 6. 洛谷P1471 方差 题目大意:维护一个数列,支持区间加,以及求区间平均值和区间方差。 解题方法:线段维护区间和与区间平方和。通过数学推导,方差可以由平方和与和推导出来。 7. 洛谷P1531 I Hate It 题目大意:单点修改,区间查询最大值(RMQ问题)。 解题方法:线段维护区间最大值。适合入门。 以上题目难度由浅入深,涵盖了线段的基本操作、延迟标记、扫描线、复杂信息维护等。 相关问题: 1. 线段在处理区间问题时有哪些优势? 2. 线段在处理区间修改时,延迟标记(lazy tag)是如何工作的? 3. 扫描线算法通常用于解决哪些问题? 4. 如何用线段维护区间历史最值? 5. 线段状数组在应用上有何异同?</think>### 线段经典练习题推荐(洛谷平台) 以下是结合经典题型和引用内容的推荐题目列表,难度由浅入深,覆盖线段的核心应用场景: --- #### **1. 基础模板题** - **P3372 【模板】线段1** - **内容**:区间加法、区间求和 - **推荐理由**:线段最基础的模板题,适合入门[^2]。 - **P3373 【模板】线段2** - **内容**:区间加法+乘法混合操作 - **关键点**:需处理多种标记的优先级(先乘后加)[^4]。 --- #### **2. 扫描线应用(面积/覆盖问题)** - **P5490 【模板】扫描线** - **内容**:求 $n$ 个矩形的面积并 - **方法**:扫描线+线段维护区间覆盖长度[^4]。 - **P1502 窗口的星星** - **内容**:用固定窗口框住星星的最大亮度 - **技巧**:将点转化为矩形,扫描线求最大重叠值[^2]。 --- #### **3. 二分答案+线段** - **P2824 [HEOI2016/TJOI2016]排序** - **内容**:对序列的局部区间升序/降序排序,最后查询单点值 - **解法**: 1. 二分答案 $x$,将序列转化为 $01$ 序列($≥x$ 为 $1$,否则为 $0$) 2. 用线段模拟区间排序(统计 $1$ 的数量并区间赋值)[^1]。 --- #### **4. 动态开点与权值线段** - **P3960 列队(NOIP2017)** - **内容**:矩阵中多次删除元素并添加到队尾 - **优化**:动态开点线段维护区间删除和查询位置。 --- #### **5. 复杂标记与信息维护** - **P2572 [SCOI2010]序列操作** - **内容**:区间赋值、取反、求和、求连续 $1$ 的最大长度 - **难点**:设计标记传递规则,维护多维度信息(需记录左右端点状态)[^4]。 - **P1471 方差** - **内容**:维护区间方差 $s^2 = \frac{1}{n} \sum (x_i - \bar{x})^2$ - **技巧**:转化为维护区间和 $\sum x_i$ 与区间平方和 $\sum x_i^2$[^2]。 --- #### **6. 空间优化与分块对比** - **分块练习题(如引用[3])** - **场景**:当空间限制严格时(如 $4\text{MB}$),分块可能优于线段 - **思考点**:对比线段与分块在时间/空间上的取舍[^3]。 --- ### 练习建议 1. **先掌握模板**:完成 `P3372` 和 `P3373`,理解延迟标记(lazy tag)的实现。 2. **再攻应用场景**:尝试扫描线(`P5490`)和二分答案(`P2824`)。 3. **最后挑战综合题**:如 `P2572` 需同时处理多种操作,适合检验综合能力。 > 提示:所有题目均可在洛谷在线评测系统提交,部分题目在引用[1]的OJ中已收录题解。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值