題目描述
編寫一棵二叉排序樹,來支援以下 \(6\) 種操作:
插入 \(x\) 數
刪除 \(x\) 數(若有多個相同的數,因只刪除乙個;如果 \(x\) 不存在則不需要刪除)
查詢 \(x\) 數的排名(排名定義為比當前數小的數的個數 \(+1\) ;如果 \(x\) 不存在則輸出 \(-1\))
查詢排名為 \(x\) 的數(如果 \(x\) 大於樹中元素個數,則輸出 \(-1\))
求 \(x\) 的前驅(前驅定義為小於 \(x\),且最大的數;如果沒有輸出 \(-1\) )
求 \(x\) 的後繼(後繼定義為大於 \(x\),且最小的數;如果沒有輸出 \(-1\) )
輸入格式
第一行為 \(n\)(\(1 \le n \le 10000\)),表示操作的個數,下面 \(n\) 行每行有兩個數 \(\text\) 和 \(x\),\(\text\) 表示操作的序號( \(1 \leq \text \leq 6\) )
輸出格式
對於操作 \(3,4,5,6\) 每行輸出乙個數,表示對應答案
樣例輸入
10
1 31 7
1 15
1 12
3 72 7
3 74 1
5 86 8
樣例輸出2-13
312
實現**如下:
#include using namespace std;
const int maxn = 100010;
int lson[maxn], rson[maxn], val[maxn], sz, cnt, tot[maxn];
void insert(int num)
// 判斷num是否存在
int x = 1;
while (true)
else
}// 插入num
cnt ++;
val[++sz] = num;
tot[sz] = 1;
x = 1;
while (true)
}else }}
}void delete(int num)
int x = 1, p = 0, y, q;
while (true)
else
}cnt --;
x = 1; p = 0;
while (true)
else
}if (!lson[x] && !rson[x])
}else if (lson[x])
if (lson[q] == y) lson[q] = lson[y];
else rson[q] = lson[y];
val[x] = val[y];
}else
if (lson[q] == y) lson[q] = rson[y];
else rson[q] = rson[y];
val[x] = val[y];
}}int getrank(int num)
else if (num < val[x])
else
}if (!exist) return -1;
// 然後從上到下判斷
x = 1;
int res = 0;
while (true)
else if (val[x] < num)
else
}return res;
}int getnumbyrank(int rk)
}}int getpre(int num)
else
}return res;
}int getnext(int num)
else
}return res;
}int n, op, x;
int main()
return 0;
}
使用 set 來實現上述功能的**:
#include using namespace std;
setst;
int n, op, x;
int main()
else if (op == 3)
else if (op == 4)
}else if (op == 5)
}else
}return 0;
}
注意distance()
函式的時間複雜度是 \(o(n)\) 的。 二叉排序樹基本操作
1.儲存結構 二叉鍊錶 include include typedef struct bitnode bitnode,bitree 2.二叉排序樹查詢演算法 遞迴查詢二叉排序樹t中是否存在key status search bitree t,int key,bitree f,bitree p p指向...
二叉排序樹基本操作
二叉排序樹,顧名思義,是一種排列好順序的二叉樹。它的排序規則是 每個結點的左子樹上的值都比它本身的值小,右子樹上的值都比它本身的值大。include include define true 1 define false 0 typedef struct binode binode,bitree in...
二叉排序樹的基本操作
二叉排序樹 其中有插入 刪除 查詢操作 include include define false 0 define ture 1 define maxsize 10 typedef struct bitnode bitnode,bitree 查詢 f指向t的雙親,初始時為null 這裡用f,p,是問...