1.新二叉树
此题通过他们的acall码作为他们的地址进行传参
只有第一个根节点是要被存贮的
下面2到第n行都是对第一个字符的父节点的左右兄弟赋值
#include<iostream>
using namespace std;
struct node
{
char c,l,r;
};
int n;//几层
node tree[1000];
void preorder(char c)//前序遍历
{
cout<<c;
if(tree[c].l!='*')preorder(tree[c].l);
if(tree[c].r!='*')preorder(tree[c].r);
}
int main()
{
cin >> n;
char c,r;
for(int i=1;i<=n;i++)
{
cin >> c;
if(i==1)
r=c;//第一个为根节点
cin >> tree[c].l>>tree[c].r;//对这个父节点的左右进行赋值
tree[tree[c].l].r=tree[tree[c].r].r=c;//在对两个节点的父节点赋值
}
preorder(r);
}
2.快排
第一次是按模板做的只得了40分
因为模板的基准数都是固定的如果把最大数放第一个就没有意义了,为了
防止最坏的情况我们要随机抽取基准值
#include<iostream>
#include<algorithm>
using namespace std;
const int max_n=1e5+10;
int a[max_n];
void qk(int l,int r)
{
int temp=a[(l+r)/2];//用中心做基准值
int i=l;//开始
int j=r;//结束
while(i<=j)
{
while(a[j]>temp)//开始从右边出发寻找比基准值大的
j--;
while(a[i]<temp)//开始从左边出发寻找比基准值小的
i++;
if(i<=j)//交换两个数的位置
{
int t=a[i];
a[i]=a[j];
a[j]=t;
i++;
j--;
}
}
if(l<j)qk(l,j);//继续处理左边的
if(i<r)qk(i,r);//继续处理右边的
}
int main()
{
int n;
cin >> n;
for(int i=1;i<=n;i++)
cin >> a[i];
qk(1,n);
for(int i=1;i<=n;i++)
cout <<a[i]<<' ';
}