Mari kita mendefinisikan fungsi split(T,v)
yang mengambil pohon, T
dan nilai untuk dipecah pada v
,. Misalkan setiap simpul pohon menyimpan anak kirinya dan anak kanan di samping nilai pada simpul itu. Gunakan algoritma berikut:
Pertama kita periksa untuk melihat apakah pohon input hanya daun atau tidak.
Jika T
bukan daun, bandingkan nilai simpul akarnya v'
dengan v
.
Jika v' < v
kemudian secara rekursif panggilan split pada subtree kiri. Simpan nilai-nilai panggilan rekursif sebagai L'
(pohon kiri kembali), R'
(pohon kanan kembali), dan r
(jenis opsi ditunjukkan jika nilai v
ditemukan atau tidak). Bangun pohon kanan baru newR = Node(R',v',R)
,, dan kembali (L',r,newR)
.
Lain jika v' > v
kemudian secara rekursif panggilan split pada subtree kanan. Simpan nilai-nilai panggilan rekursif sebagai L'
(pohon kiri kembali), R'
(pohon kanan kembali), dan r
(jenis opsi ditunjukkan jika nilai v
ditemukan atau tidak). Bangun pohon kiri baru newL = Node(L',v',L)
,, dan kembali (newL,r,R')
.
Jika tidak v' = v
, kembalilah L, SOME(v), R
.
Jika T
adalah daun, kita harus telah mencapai akar pohon tanpa menemukan nilai input v untuk dibelah. Kembali bahwa Anda tidak dapat menemukan daun dengan melewati kembali NONE
.
Mengapa ini logaritmik? Yah, paling banyak kamu hanya melintasi satu jalur pohon ke daun. Kita dapat dengan mudah merekonstruksi node dalam waktu yang konstan karena kita hanya menetapkan ulangO ( logn ) referensi (dalam bahasa imperatif) atau penugasan kembali O ( logn ) nilai-nilai yang membutuhkan waktu konstan untuk menghasilkan (dalam bahasa fungsional).
Berikut kode yang sesuai untuk algoritme. Itu ditulis dalam SML, tetapi saya akan bersedia untuk menjelaskan apa artinya dalam komentar.
fun split(T,v) =
case T of
Leaf => (Leaf, NONE, Leaf)
| Node(L,v,R) =>
case compare(v, v') of
LESS =>
let
val (L',r,R') = split(L,k)
in
(L',r,Node(R',r,R))
end
| GREATER =>
let
val (L',r,R') = split(R,k)
in
(Node(L',v',L),r,R')
end
| EQUAL => (L, SOME(v), R)
Lihat dokumen ini untuk lebih jelasnya. Ini memberikan penjelasan yang lebih menyeluruh tentang hal di atas.