社区讨论

求助红黑树

灌水区参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lockaj4i
此快照首次捕获于
2023/10/30 15:11
2 年前
此快照最后确认于
2023/11/05 02:25
2 年前
查看原帖
自己打了一个红黑树的代码(无删除),插入之后就是不能输出插入的数,求改
CPP
#include <bits/stdc++.h>

using namespace std;

#define Bro(x) (ch[fthr[x]][0] == x ? ch[fthr[x]][1] : ch[fthr[x]][0])
#define Chd(x) (ch[fthr[x]][0] == x ? 0 : 1)
const int MaxN = 1e6 + 100, INF = 0x7fffffff;
typedef enum ColorType {RED, BLACK, WU} ColorType;
int val[MaxN], size[MaxN], cnt[MaxN], ch[MaxN][2], fthr[MaxN];
ColorType color[MaxN];
int tot, root = 0;

int NewNode (int x, int v) {
	++ tot;
	val[tot] = x;
	cnt[tot] = size[tot] = 1;
	ch[tot][0] = ch[tot][1] = 0;
	fthr[tot] = v;
	color[tot] = RED;
	return tot;
}

void PushUp (int p) {
	size[p] = size[ch[p][0]] + size[ch[p][1]] + cnt[p];
	if (p != root && p != 0) {
		PushUp (fthr[p]);
	}
}

void Build () {
	root = NewNode (-INF, 0);
	color[root] = BLACK;
	ch[root][1] = NewNode (INF, root);
	color[ch[root][1]] = BLACK;
	PushUp (ch[root][1]);
}

void Rotate (int &p, int d) {
	int Tmp = ch[p][d ^ 1];
	ch[p][d ^ 1] = ch[Tmp][d];
	ch[Tmp][d] = p;
	p = Tmp;
	PushUp (ch[p][d]);
}

int Rank (int p, int x) {
	if (! p) return 1;
	else if (x == val[p]) return size[ch[p][0]] + 1; 
	else if (x < val[p]) return Rank (ch[p][0], x);
	else if (x > val[p]) return size[ch[p][0]] + cnt[p] + Rank (ch[p][1], x);
}

int Val (int p, int rank) {
	if (! p) return 0;
	else if (rank <= size[ch[p][0]]) return Val (ch[p][0], rank);
	else if (rank <= size[ch[p][0]] + cnt[p]) return val[p];
	else return Val (ch[p][1], rank - size[ch[p][0]] - cnt[p]);
}

int Pre (int p, int x) {
	int id = 1, pre;
	while (id) {
		if (val[id] < x) pre = val[id], id = ch[id][1];
		else id = ch[id][0];
	}
	return pre;
}

int Next (int p, int x) {
	int id = 1, next;
	while (id) {
		if (val[id] > x) next = val[id], id = ch[id][0];
		else id = ch[id][1];
	}
	return next;
}

int Find (int p, int x, int id, int father = 0) {
	if (! p) {
		if (id == 0) return INF;
		else return father;
	}
	else if (x < val[p]) return Find (ch[p][0], x, id, p);
	else if (x > val[p]) return Find (ch[p][1], x, id, p);
	else if (x == val[p]) return p;
}

void DoubleRed1 (int p) {
	if (p == root) {
		color[p] = BLACK;
		return ;
	} else if (color[fthr[p]] == BLACK) {
		return ;
	} else {
		color[fthr[fthr[p]]] = RED;
		color[fthr[p]] = BLACK;
		color[Bro (fthr[p])] = BLACK;
		DoubleRed1 (fthr[fthr[p]]);
	}
}

void DoubleRed2 (int p) {
	if (Chd (fthr[p]) == 0) {
		if (Chd (p) == 0) {
			color[fthr[p]] = BLACK;
			color[fthr[fthr[p]]] = RED;
			Rotate (fthr[fthr[p]], 1);
		} else {
			Rotate (fthr[p], 0);
			DoubleRed2 (p);
		}
	} else {
		if (Chd (p) == 1) {
			color[fthr[p]] = BLACK;
			color[fthr[fthr[p]]] = RED;
			Rotate (fthr[fthr[p]], 0);
		} else {
			Rotate (fthr[p], 1);
			DoubleRed2 (p);
		}
	}
}

void Insert (int &p, int x) {
	if (! root) {
		root = NewNode (x, 0);
		color[root] = BLACK;
		PushUp (root);
		return ;
	} else {
		int id = Find (root, x, 0);
		if (id == INF) {
			id = Find (root, x, 1);
			ch[id][x > val[id]] = NewNode (x, id);
			if (color[id] != BLACK) {
				if (Bro (id) != 0 && color[Bro (id)] == RED) {
					DoubleRed1 (ch[id][x > val[id]]);
				} else {
					DoubleRed2 (ch[id][x > val[id]]);
				}
			}
			PushUp (ch[id][x > val[id]]);
		} else {
			++ cnt[id];
			PushUp (id);
		}
	}
}

void OutPut (int p) {
	if (p) {
		OutPut (ch[p][0]);
		printf ("%d ", val[p]);
		OutPut (ch[p][1]);
	}
}

int main () {
	
	Build ();
	Insert (root, 1);
	Insert (root, 2);
	Insert (root, 3);
	Insert (root, 4);
	Insert (root, 5);
	Insert (root, 6);
	Insert (root, 7);
	Insert (root, 8);
	OutPut (root);
	
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...