额,二叉搜索树删除求调
  • 板块学术版
  • 楼主ka_da_Duck
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/28 11:08
  • 上次更新2024/1/28 13:07:49
查看原帖
额,二叉搜索树删除求调
1088058
ka_da_Duck楼主2024/1/28 11:08
nclude <bits/stdc++.h>

using namespace std;
const int maxn = 1e3 + 10;

struct Node {
	int val, cnt;
	int lc, rc;
}tree[maxn];

int tot = 0;
int create(int x) {
	tree[++tot] = (Node){x, 1, 0, 0};
	return tot;
}

void insert(int &u, int x) {
	if (!u) {
		create(x);
		return;
	} if (x == tree[u].val) {
		tree[u].cnt++;
		return;
	} else if (x < tree[u].val) insert(tree[u].lc, x);
	else insert(tree[u].rc, x);
}

int n, rt, x, q, op;

void remove(int &u, int x) {
	if (!u) return;
	else if (x < tree[u].val) remove(tree[u].lc, x);
	else if (x > tree[u].val) remove(tree[u].rc, x);
	else {
		if (!tree[u].lc) u = tree[u].rc;
		else if (!tree[u].rc) u = tree[u].lc;
		else {
			int v = tree[u].rc;
			while (tree[v].lc) v = tree[v].lc;
			swap(tree[u].val, tree[v].val);
			remove(tree[u].rc, x);
		}
	}
}

void dfs(int u) {
	if (!u) return;
	dfs(tree[u].lc);
	cout << tree[u].val << ' ';
	dfs(tree[u].rc);
}

signed main() {
	cin >> n >> q;
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &x);
		insert(rt, x);
	}
	while (q--) {
		scanf("%d%d", &op, &x);
		if (op == 1) {
			insert(rt, x);
		} else {
			remove(rt, x);
		}
	}
	dfs(rt);
}
2024/1/28 11:08
加载中...