Cây nhị phân nối vòng

Một phần của tài liệu Cấu trúc dữ liệu giải thuật (Trang 81 - 84)

Ta thấy số các trường móc nối (Left và Right) của một cây có giá trị Nil khá nhiều (nếu có n nút thì sẽ có (n+1) con trỏ Nil). Để tận dụng các trường móc nối này, người ta tìm cách cho các con trỏ này trỏ đến các nút quy định mà theo một nghĩa nào đó là để tạo điều kiện cho phép duyệt cây được thuận tiện. Loại móc nối này gọi là nối vòng và cây nhị phân như vậy được gọi là cây nhị phân nối vòng.

Quy ước:Để xây dựng cây nối vòng từ một cây đã cho ta có một số quy ước sau: - Phép duyệt cây theo thứ tự giữạ

- Cho một nút P và cho một phép duyệt (theo thứ tự giữa). Lúc đó, ta có ký hiệu: +P: là nút đứng trước P.

P+: là nút đứng sau P.

Ví dụ: Cho cây có thứ tự giữa Head CBDAEF Head:

- Với một nút P bất kỳ, nếu:

+ p^.Left = Nil thì điều chỉnh để p^.Left=+P. + p^.Right = Nil thì điều chỉnh để p^.Right=P+. Nhận xét:

- Bấy giờ rõ ràng máy không thể phân biệt móc nối nào là thực và móc nối nào là giả. Vì vậy, trong quy cách của một nút ta phải thêm vào 2 trường kiểm tra: LType và RType (kiểu Boolean) như sau:

+ Khi p^.LType = True thì p^.Left là trỏ thực. Khi p^.LType = False thì p^.Left là trỏ giả. + Tương tựđối với RTypẹ

- Ta cũng nhận xét rằng, trong việc thiết lập như ví dụ trên, trường Left nút cực trái (nút C) và trường Right nút cực phải (nút F) vẫn còn Nil. Để tận dụng người ta đưa vào một nút đầu cây là Head sao cho T là cây con trái của Head, nghĩa là: Head^.Left=T và trường Right của Head trỏ lại Head nghĩa là: Head^.Right = Head. Và quy định trường Left nút cực trái và trường Right nút cực phải trỏ tới Head. Hàm xác định p+ ca p:

Function Succ(p) {p: ConTro} 1.q:=p^.Right; If p^.RType=False then Begin Succ(p):=q; Exit; A B E F D C Head CBDAEF +A = D A+ = E T

End;

2.While q^.LType=True do q:=q^.Left; 3.Succ(p):=q;

Return;

Hàm xác định +p ca p:

Function Pred(p) {p: ConTro} 1.q:=p^.Left;

If p^.LType=False then Begin

Pred(p):=q; Exit; End;

2.While q^.RType=True do q:=q^.Right; 3.Pred(p):=q; Return; Th tc duyt cây ni vòng: Procedure Duyetcay(Head); 1. p:=Head; 2. While True do Begin p:=Succ(p);

If p=Head then Exit Else Write(p^.Info); End;

Return;

Th tc thc hin phép b sung mt nút vào cây thành cây con trái ca nút p cho trên cây ni vòng:

1. New(q); q^.Info:=X;

q^.Left:=p^.Left; q^.LType:=p^.LType; p^.Left:=q; p^.LType:=True;

q^.Right:=p; q^.RType:=False;

2.If q^.LType=True then {p dang tro toi mot canh} Begin w:=Pred(q); w^.Right:=q; w^.RType:=False; End; Return; ♣ Bài tp:

Viết chương trình tạo một cây nhị phân nối vòng từ một cây nhị phân đã cho .

Một phần của tài liệu Cấu trúc dữ liệu giải thuật (Trang 81 - 84)

Tải bản đầy đủ (PDF)

(151 trang)