Tô màu cây nhị phân thành cây đỏ-đen


16

Một câu hỏi phỏng vấn phổ biến là đưa ra một thuật toán để xác định xem một cây nhị phân nhất định có cân bằng chiều cao không (định nghĩa cây AVL).

Tôi đã tự hỏi nếu chúng ta có thể làm điều gì đó tương tự với cây Đỏ-Đen.

Đưa ra một cây nhị phân không được tùy ý (với các nút NULL), có thuật toán "nhanh" nào có thể xác định xem chúng ta có thể tô màu (và tìm màu) các nút Đỏ / Đen để chúng thỏa mãn tất cả các thuộc tính của cây Đỏ-Đen không (định nghĩa như trong câu hỏi này )?

Một suy nghĩ ban đầu là chúng ta có thể loại bỏ các nút NULL và cố gắng xác minh đệ quy nếu cây kết quả có thể là cây đỏ đen, nhưng dường như không đi đến đâu.

Tôi đã (một bản tóm tắt) tìm kiếm trên web các bài báo, nhưng dường như không thể tìm thấy bất kỳ thứ gì có vẻ như để giải quyết vấn đề này.

Có thể là tôi đang thiếu một cái gì đó đơn giản.


Tôi khá chắc chắn một cây có thể đỏ-đen màu iff cho mỗi nút, con đường dài nhất từ nó vào một nút NULL là không quá hai lần dài hơn một ngắn nhất. Là đủ nhanh?
Karolis Juodelė

Câu trả lời:


12

Nếu với mỗi nút của cây, đường dẫn dài nhất từ ​​nút đến nút lá dài hơn không quá hai lần so với nút ngắn nhất, thì cây có màu đỏ đen.

Đây là một thuật toán để tìm ra màu của bất kỳ nút nào 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

Đây n.black-quotalà số lượng nút đen mà bạn mong đợi sẽ thấy một chiếc lá, từ nút nn.min-heightlà khoảng cách đến chiếc lá gần nhất.

Để cho ngắn gọn của ký hiệu, hãy để , và .h ( n ) = m ( n ) =b(n)= n.black-quotah(n)= n.heightm(n)= n.min-height

Định lý: Sửa chữa một cây nhị phân . Nếu với mọi nút , và cho nút , thì có màu đen đỏ với các nút đen chính xác trên mọi đường dẫn từ gốc đến lá.n T h ( n ) 2 m ( n ) r = gốc ( T ) b ( r ) [ 1TnTh(n)2m(n)r=root(T)Tb(r)b(r)[12h(r),m(r)]Tb(r)

Chứng minh: Cảm ứng trên .b(n)

Xác minh rằng tất cả bốn cây có chiều cao một hoặc hai đều thỏa mãn định lý với .b(n)=1

Theo định nghĩa của cây đỏ-đen, gốc là màu đen. Đặt là một nút có cha mẹ đen sao cho . Khi đó , và .p b ( p ) [ 1npb(n)=b(p)-1h(n)=h(p)-1h(n)m(n)m(p)-1b(p)[12h(p),m(p)]b(n)=b(p)1h(n)=h(p)1h(n)m(n)m(p)1

Giả sử định lý giữ cho tất cả các cây có gốc , .b ( r ) < b ( q )rb(r)<b(q)

Nếu , thì có thể có màu đỏ đen theo giả định quy nạp.nb(n)=m(n)n

Nếu thì . không thỏa mãn giả định quy nạp và do đó phải có màu đỏ. Cho là con của . và . Sau đó có thể có màu đỏ-đen theo giả định quy nạp.b(n)=1b(p)=12h(p)ncnh(c)=h(p)-2b(c)=b(p)-1=1b(n)=12h(n)1ncnh(c)=h(p)2cb(c)=b(p)1=12h(p)1=12h(c)c

Lưu ý rằng, theo cùng một lý do, nếu , thì cả và con của thỏa mãn giả định quy nạp. Do đó có thể có bất kỳ màu nào.nnnb(n)(12h(r),m(r))nnn


@Aryabhata, bất kỳ giao dịch nào cũng được, miễn là cha mẹ được nhìn thấy trước con cái của nó. Tôi không có bằng chứng chính thức bằng văn bản, nhưng tôi có ý tưởng về việc nó sẽ trông như thế nào. Tôi sẽ thử viết một cái gì đó khi tôi có thể.
Karolis Juodelė

@Aryabhata, tôi đã thêm một bằng chứng. Xin lỗi vì tôi lâu quá.
Karolis Juodelė

@Aryabhata, ý tưởng là nếu của một số nút bị giới hạn nhất định, một đứa trẻ hoặc cháu của có thể có trong cùng giới hạn đó. Có trong các giới hạn đó có thể tương ứng với là màu đen. Hầu hết các bằng chứng là về ràng buộc và của một đứa trẻ hoặc cháu, được cho và của cha mẹ hoặc ông bà. Cây của bạn chắc chắn là màu. , con trái màu đen và con phải màu đỏ, đường dẫn có chiều dài 16 là , đường dẫn có độ dài 8 làp cb(p)pcpb(c)b(n)nhmhmb(root)=8brbrbrbbbbbbbb, đường dẫn của 9 và 12 có thể có nhiều màu hợp lệ.
Karolis Juodelė


2

Tôi tin rằng câu trả lời của Karolis là chính xác (và một đặc điểm khá hay của cây đỏ đen, đưa ra thuật toán thời gian ), chỉ muốn thêm một câu trả lời khả dĩ khác.O(n)

Một cách tiếp cận là sử dụng lập trình động.

Cho một cây, với mỗi nút , bạn xây dựng hai bộ: và có chứa độ cao đen có thể có cho cây con gốc ở . chứa các độ cao màu đen giả sử có màu Đỏ và giả sử có màu đen.S R ( n ) S B ( n ) n S R ( n ) n S B ( n ) nnSR(n)SB(n)nSR(n)nSB(n)n

Bây giờ được cung cấp các bộ cho và (tức là con trực tiếp của ), chúng ta có thể tính toán các bộ tương ứng cho , bằng cách lấy các giao điểm và hiệp nhất thích hợp (và tăng dần khi cần thiết).n . R i g h t n nn.Leftn.Rightnn

Tôi tin rằng đây là thuật toán thời gian .O(nlogn)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.