สีต้นไม้ไบนารีให้เป็นต้นไม้สีแดงดำ


16

คำถามสัมภาษณ์ที่พบบ่อยคือการให้อัลกอริทึมเพื่อตรวจสอบว่าต้นไม้ไบนารีที่กำหนดมีความสูงสมดุล (นิยามของต้นไม้ AVL)

ฉันสงสัยว่าถ้าเราสามารถทำอะไรที่คล้ายกับต้นไม้สีแดงดำ

ได้รับไบนารีต้นไม้ที่ไม่มีการสุ่มสี (พร้อม NULL nodes) มีอัลกอริทึม "เร็ว" ซึ่งสามารถกำหนดได้ว่าเราสามารถทำสี (และค้นหาการระบายสี) โหนดแดง / ดำเพื่อให้พวกเขาตอบสนองคุณสมบัติทั้งหมดของต้นไม้สีแดง - ดำ (คำจำกัดความในคำถามนี้)?

ความคิดเริ่มแรกคือเราสามารถเอาโหนด NULL ออกและลองตรวจสอบซ้ำ ๆ ว่าต้นไม้ที่เกิดขึ้นนั้นสามารถเป็นต้นไม้สีแดงดำได้หรือไม่ แต่ดูเหมือนจะไม่ไปไหนเลย

ฉันทำเว็บ (สั้น ๆ ) เพื่อค้นหาเอกสาร แต่ดูเหมือนจะไม่พบสิ่งใดที่ดูเหมือนจะจัดการกับปัญหานี้

เป็นไปได้ว่าฉันขาดอะไรง่ายๆ


ฉันค่อนข้างแน่ใจว่าต้นไม้สามารถiffสีแดงดำสำหรับแต่ละโหนดเส้นทางที่ยาวที่สุดจากมันไปยังโหนด NULL ไม่เกินสองเท่ากว่าที่สั้นที่สุด เร็วพอหรือไม่
Karolis Juodelė

คำตอบ:


12

หากสำหรับแต่ละโหนดของต้นไม้เส้นทางที่ยาวที่สุดจากโหนดนั้นไปยังโหนดใบจะไม่ยาวกว่าโหนดที่สั้นที่สุดสองเท่ากว่าต้นไม้ที่มีสีแดงดำ

นี่คืออัลกอริทึมที่ใช้หาสีของโหนดใด ๆ n

if n is root,
    n.color = black
    n.black-quota = height n / 2, rounded up.

else if n.parent is red,
    n.color = black
    n.black-quota = n.parent.black-quota.

else (n.parent is black)
    if n.min-height < n.parent.black-quota, then
        error "shortest path was too short"
    else if n.min-height = n.parent.black-quota then
        n.color = black
    else (n.min-height > n.parent.black-quota)
        n.color = red
    either way,
        n.black-quota = n.parent.black-quota - 1

ที่นี่n.black-quotaเป็นจำนวนโหนดสีดำที่คุณคาดว่าจะเห็นไปใบจากโหนดnและn.min-heightเป็นระยะทางถึงใบที่ใกล้ที่สุด

เพื่อความกระชับของโน้ตให้ , เอช( n ) =และม. ( n ) =b(n)= n.black-quotah(n)= n.heightm(n)= n.min-height

ทฤษฎีบท: Fix ต้นไม้ไบนารีTถ้าสำหรับทุกโหนดn T , h ( n ) 2 m ( n )และสำหรับโหนดr = root ( T ) , b ( r ) [ 1TnTh(n)2m(n)r=root(T)จากนั้นTมีสีแดง - ดำที่มีจุดสีดำb(r)ทุกจุดตั้งแต่รูทถึงลีฟb(r)[12h(r),m(r)]Tb(r)

พิสูจน์:การเหนี่ยวนำกว่า )b(n)

ตรวจสอบว่าทั้งสี่ต้นของความสูงหนึ่งหรือสองตอบสนองความทฤษฎีบทที่มี 1b(n)=1

ตามคำจำกัดความของต้นไม้สีแดงดำรากเป็นสีดำ ให้เป็นโหนดกับบิดามารดาสีดำพีดังกล่าวว่า( P ) [ 1np] จากนั้น(n)=B(P)-1,เอช(n)=H(P)-1และเอช(n)เมตร(n)เมตร(P)-1b(p)[12h(p),m(p)]b(n)=b(p)1h(n)=h(p)1h(n)m(n)m(p)1

Assume the theorem holds for all trees with root r, b(r)<b(q).

If b(n)=m(n), then n can be red-black colored by the inductive assumption.

If b(p)=12h(p) then b(n)=12h(n)1ncnh(c)=h(p)2 and b(c)=b(p)1=12h(p)1=12h(c)c

b(n)(12h(r),m(r)), then both n and a child of n satisfy the inductive assumption. Therefore n could have any color.


@Aryabhata, any traversal is fine, as long as the parent is seen before its children. I don't have a formal proof written, but I have an idea of how it would look. I'll try writing something up when I can.
Karolis Juodelė

@Aryabhata, i added a proof. Sorry I took so long.
Karolis Juodelė

@Aryabhata, the idea is that if b(p) of some node p is withing certain bounds, a child or grandchild c of p can have b(c) within those same bounds. Having b(n) in those bounds may correspond to n being black. Most of the proof is about bounding h and m of a child or grandchild, given h and m of the parent or grandparent. Your tree is certainly colorable. b(root)=8, left child is black and right child is red, the path of length 16 is brbrbr, the path of length 8 is bbbbbbbb, paths of 9 and 12 can have multiple valid colorings.
Karolis Juodelė


2

I believe Karolis' answer is correct (and a pretty nice characterization of red-black trees, giving an O(n) time algorithm), just wanted to add another possible answer.

One approach is to use dynamic programming.

Given a tree, for each node n, you construct two sets: SR(n) and SB(n) which contains the possible black-heights for the subtree rooted at n. SR(n) contains the black-heights assuming n is coloured Red, and SB(n) assuming n is coloured black.

Now given the sets for n.Left and n.Right (i.e direct children of n), we can compute the corresponding sets for n, by taking appropriate intersections and unions (and incrementing as needed).

I believe this comes out be an O(nlogn) time algorithm.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.