Pertanyaan wawancara yang umum adalah untuk memberikan algoritma untuk menentukan apakah pohon biner yang diberikan seimbang tinggi (definisi pohon AVL).
Saya bertanya-tanya apakah kita bisa melakukan sesuatu yang mirip dengan pohon Merah-Hitam.
Diberikan pohon biner tanpa warna yang sewenang-wenang (dengan simpul NULL), apakah ada algoritma "cepat" yang dapat menentukan apakah kita dapat mewarnai (dan menemukan pewarnaan) simpul Merah / Hitam sehingga mereka memenuhi semua sifat-sifat pohon Merah-Hitam (definisi seperti dalam pertanyaan ini )?
Pikiran awal adalah bahwa kita bisa menghapus node NULL dan mencoba untuk memverifikasi secara rekursif jika pohon yang dihasilkan bisa menjadi pohon merah-hitam, tetapi itu tampaknya tidak pergi ke mana pun.
Saya melakukan (singkat) pencarian web untuk makalah, tetapi tampaknya tidak dapat menemukan yang tampaknya berurusan dengan masalah ini.
Mungkin saja saya kehilangan sesuatu yang sederhana.
sumber
Jawaban:
Jika untuk setiap simpul pohon, jalur terpanjang dari itu ke simpul daun tidak lebih dari dua kali lebih lama dari yang terpendek, pohon memiliki pewarnaan merah-hitam.
Berikut ini adalah algoritma untuk mengetahui warna dari simpul apa pun
n
Berikut
n.black-quota
adalah jumlah simpul hitam yang Anda harapkan untuk melihat pergi ke daun, dari simpuln
dann.min-height
jarak ke daun terdekat.Untuk singkatnya notasi, misalkan , h ( n ) = dan m ( n ) = .b(n)= h(n)= m(n)=
n.black-quota
n.height
n.min-height
Teorema: Perbaiki pohon biner . Jika untuk setiap simpul n ∈ T , h ( n ) ≤ 2 m ( n ) dan untuk simpul r = root ( T ) , b (T n∈T h(n)≤2m(n) r=root(T) laluTb(r)∈[12h(r),m(r)] T memiliki pewarnaan merah-hitam dengan tepat simpul hitam di setiap jalur dari akar ke daun.b(r)
Bukti: Induksi lebih dari .b(n)
Verifikasi bahwa keempat pohon dengan tinggi satu atau dua memenuhi teorema dengan .b(n)=1
Menurut definisi pohon merah-hitam, root adalah hitam. Biarkan menjadi simpul dengan p induk hitam sehingga b (n p . Kemudianb(n)=b(p)-1,h(n)=h(p)-1danh(n)≥m(n)≥m(p)-1.b(p)∈[12h(p),m(p)] b(n)=b(p)−1 h(n)=h(p)−1 h(n)≥m(n)≥m(p)−1
Asumsikan teorema berlaku untuk semua pohon dengan root , b ( r ) < b ( q ) .r b(r)<b(q)
Jika , maka n dapat berwarna merah-hitam dengan asumsi induktif.b(n)=m(n) n
Jika lalub(n)=⌈1b(p)=12h(p) . ntidak memenuhi asumsi induktif dan karenanya harus merah. Biarkancmenjadi anak darin. h(c)=h(p)-2dan b(c)=b(p)-1=1b(n)=⌈12h(n)⌉−1 n c n h(c)=h(p)−2 . Maka c dapat diwarnai merah-hitam dengan asumsi induktif.b(c)=b(p)−1=12h(p)−1=12h(c) c
Perhatikan bahwa, dengan alasan yang sama, jika , makandan anaknmemenuhi asumsi induktif. Karenanyandapat memiliki warna apa pun.b(n)∈(12h(r),m(r)) n n n
sumber
Saya percaya jawaban Karolis benar (dan karakterisasi pohon merah-hitam yang cukup bagus, memberikan algoritma waktu n ) ), hanya ingin menambahkan kemungkinan jawaban lain.O(n)
Salah satu pendekatan adalah menggunakan pemrograman dinamis.
Diberikan pohon, untuk setiap node , Anda membangun dua set: S R ( n ) dan S B ( n ) yang berisi kemungkinan ketinggian-hitam untuk subtree yang berakar pada n . S R ( n ) berisi ketinggian-hitam dengan asumsi n berwarna Merah, dan S B ( n ) dengan asumsi n berwarna hitam.n SR(n) SB(n) n SR(n) n SB(n) n
sumber