intgetnxt(int val){ int ans = 2; // 我觉得吧,答案节点要从 2 开始防止判断边 int p = rt; // 从根开始找 while(p) { if(val == a[p].val) { // 如果找到了 val if(a[p].r > 0) { // 如果还有右子树 p = a[p].r; // 进入它的右子树,然后往左边跑去找更合适 while(a[p].l > 0) p = a[p].l; // 往左边跑 ans = p; // 更新下 ans } break; }
if(a[p].val > val && a[p].val < a[ans].val) ans = p; // 沿途尝试更新 ans p = val < a[p].val ? a[p].l : a[p].r; }
return ans; }
找前驱同理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
intgetpre(int val){ int ans = 1; int p = rt; while(p) { if(val == a[p].val) { if(a[p].l > 0) { p = a[p].l; while(a[p].r > 0) p = a[p].r; ans = p; } break; }
if(a[p].val < val && a[p].val > a[ans].val) ans = p; p = val > a[p].val ? a[p].l : a[p].r; }