非指针 BST 练手

本代码基于POJ 2823  来实现,基本上该有的都有了。实际BST做这题会超时。

(好吧是我逗比的想用BST去写,然后tle又不想把代码删掉只能扔这里了)

题目大意就不说了,BST写起来就是建一棵大小为K的树,然后不停找最大最小值,然后删掉一个点,加入一个点。

然后直接扔代码,要说的都在代码里

#include
#include
#include
#include
#include

using namespace std;

const int N=1000000+100;

struct node{   
	int r ,l ,fa;//左右子节点,父亲节点 
	int key;//点的值 
	int temp;//用来标记有几个这样的值&&temp=0表示这个点不存在; 
};

node tree[N];
int s[N];
int minn[N];
int mann[N];
int root =1,n,tot;

void BST(int k,int  x) 
{
  if(tree[k].temp==0)
  {
  	tree[k].key=x;
  	tree[k].temp=1;
  	return ;
  } 
 else if(x==tree[k].key)
  {
  	tree[k].temp++;
  	return ;
  }
  else if((x>tree[k].key)&&(tree[tree[k].r].temp==0))//一开始默认所有tree的左右节点都指向0,0节点的temp一直等于0;来表示左右节点不存在。 
  {                                                   //然后用tot覆盖 0来表示子节点的指向。 
  	tot++;
  	tree[k].r=tot;                                   //其他没什么好说的。 
  	tree[tot].temp=1;
  	tree[tot].key=x;
  	tree[tot].fa=k;
  	return ;
  }
  
  else if((xtree[k].key)del(tree[k].r,x);
	else if(x1)
	{
		tree[k].temp--;
		return;
	}
	
	else if(tree[k].r == 0&& tree[k].l == 0)
	{
		tree[k].temp=0;
		int fa = tree[k].fa;
		if(x


你可能感兴趣的:(非指针 BST 练手)