W każdym nodzie trzymać 2 wskaźniki na prev i next.
Odpowiednio aktualizować je przy insert i delete (odpowiednio od liści do korzenia \Rightarrow 2 razy przechodzimy ścieżkę \Rightarrow dalej O(log n).
Podczas balansowania zachowujemy porzadek inorder, wiec nic nie musimy zmieniac.
#include <stdio.h> #include <stdlib.h> int lcs(int *a, int N) { int *best, *prev, *num, i, j, max = 0; best = malloc(sizeof(int) * 3 * N); prev = best + N + 1; num = prev + N + 1; for (i = 0; i < N; i++) { best[i] = 1; prev[i] = i; num[i] = 1; } for (i = 1; i < N; i++) { int t = 1; for (j = 0; j < i; j++) { if (a[j] < a[i]) { if (best[j] + 1 > t) { best[i] = t = best[j] + 1; prev[i] = j; num[i] = num[j]; } else if (best[j] + 1 == t) { num[i] += num[j]; } } } } j = 0; for (i = 0; i < N; i++) { if (best[j] < best[i]) { j = i; max = num[j]; } else if (best[j] == best[i]) { max += num[j]; } } free(best); return max; } int main(){ int b[] = { 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 }; printf("%d\n", lcs(b, sizeof(b)/sizeof(int))); return 0; }
PyAVL
Procedura split tam jest, wlepiłbym plik, ale nie można uploadować plików bez rozszerzeń, z rozszerzeniami .txt albo .c