IIỊ3.1. Duyệt theo thứ tự trước

Một phần của tài liệu MỘT số vấn đề về KIỂU dữ LIỆU TRỪU TƯỢNG (Trang 42)

Chương III: CÂY NHỊ PHÂN

IIỊ3.1. Duyệt theo thứ tự trước

liệt kê trước giá trị lưu trong hai nút con của nó, có thể mô tả bằng thủ tục đệ qui sau:

Procedure NLR(N : Pnode);

{Duyệt nhánh cây nhận N là gốc của nhánh đó} Begin

<Output trường Val của nút N> NLR(N^.Left);

NLR(N^.Right); End;

Quá trình duyệt theo thứ tự trước bắt đầu bằng lời gọi NLR(root), với root là nút gốc của câỵ

Hình 17

Nếu ta duyệt cây trong hình 17 theo thứ tự trước thì các giá trị sẽ lần lượt được liệt kê theo thứ tự: H D B A C F E K J L.

IIỊ3.2. Duyệt theo thứ tự giữa (inorder traversal)

Trong phép duyệt theo thứ tự giữa thì giá trị trong mỗi nút bất kì sẽ được liệt kê sau giá trị lưu ở nút con trái và được liệt kê trước giá trị lưu ở nút con phải của nút đó, có thể mô tả bằng thủ tục đệ qui sau:

Procedure LNR(N : Pnode);

{Duyệt nhánh cây nhận N là gốc của nhánh đó} Begin

LNR(N^.Left);

<Output trường Val của nút N> LNR(N^.Right);

End;

Quá trình duyệt theo thứ tự giữa bắt đầu bằng lời gọi LNR(root), với root là nút gốc của câỵ

Nếu ta duyệt cây trong hình 17 theo thứ tự giữa thì các giá trị sẽ lần lượt được liệt kê theo thứ tự: A B C D E F H J K L.

IIỊ3.3. Duyệt theo thứ tự sau (postorder traversal)

Trong phép duyệt theo thứ tự sau thì giá trị trong mỗi nút bất kì sẽ được liệt kê sau giá trị lưu ở hai nút con của nút đó, có thể mô tả bằng thủ tục đệ qui sau:

Procedure LRN(N : Pnode);

{Duyệt nhánh cây nhận N là gốc của nhánh đó} Begin

LRN(N^.Left); LRN(N^.Right);

<Output trường Val của nút N> End;

Quá trình duyệt theo thứ tự sau bắt đầu bằng lời gọi LRN(root), với root là nút gốc của câỵ

Nếu ta duyệt cây trong hình 17 theo thứ tự sau thì các giá trị sẽ lần lượt được liệt kê theo thứ tự: A C B E F D J L K H.

Dưới đây là chương trình cài đặt một số thao tác cơ bản trên cây nhị phân:

Program Thaotactrencay; uses crt; const nl = #13#10; bl = #32; type PNode = ^Node; Node = record Val: integer; L,R: PNode; end; (*---

Đếm số phần tử chia hết cho k

(*---

function Count(t: PNode; k: integer): integer; var d: integer;

begin

if t = nil then d:= 0 else begin

if t^.Val mod k = 0 then d:= 1 else d:= 0; d:= d + Count(t^.L,k) + Count(t^.R,k); end;

Count:= d; end;

(*---

Tạo một nút mới có giá trị v và 2 con trỏ là lp và rp

--- *)

function NewElem(v: integer; lp,rp: PNode): PNode; var e: PNode; begin new(e); ệVal:= v; ệL:= lp; ệR:= rp; NewElem:= e; end; (*---

Tìm vị trí xuất hiện của trị v trên cây T 1: v có xuất hiện tại node u,

0: v ko xuất hiện

---*)

function Find(t: PNode; v: integer; var u: PNode): integer; begin

u:= nil;

while t <> nil do begin

u:= t;

if v <= t^.Val then t:= t^.L else t:= t^.R; end;

if v <= u^.Val then Find:= 0 else Find:= 1; end;

(*--- Tìm node chứa trị v trên cây nhị phân tìm kiếm T

---*) function PFind(t: PNode; v: integer): PNode;

var u: PNode; begin u:= nil; while t <> nil do begin u:= t;

if v <= t^.Val then t:= t^.L else t:= t^.R; end;

if v = u^.Val then PFind:= u else PFind:= nil; end;

(*--- Thêm một nút p vào cây T

---*) procedure Ađ(var t: PNode; p: PNode);

var u: PNode; begin

if t = nil then t:= p

else if Find(t,p^.Val, u) = 0 then u^.L:= p else u^.R:= p;

end;

(*--- Sinh một cây có n nút

---*) function GenTree(n: integer): PNode;

const r = 100; var i: integer; t, p: PNode; begin GenTree:= nil; if n <= 0 then exit; t:= nil; for i:= 1 to n do begin p:= NewElem(random(r),nil,nil); Ađ(t,p); end; GenTree:= t; end;

(* Hien thi tang *)

procedure LNRPrint(t: PNode); begin

if t = nil then exit; LNRPrint(t^.L);

write(t^.Val,bl); LNRPrint(t^.R); end;

(* Hien thi giam *)

procedure RNLPrint(t: PNode); begin

if t = nil then exit; RNLPrint(t^.R);

write(t^.Val,bl); RNLPrint(t^.L); end;

{Dem so nut tren cay T}

function Card(t: PNode): integer; begin

if t = nil then Card:= 0

else Card:= Card(t^.L) + Card(t^.R) + 1; end;

{Tinh tong cac nut tren cay T} function Sum(t: PNode): integer; begin

if t = nil then Sum:= 0

else Sum:= Sum(t^.L) + Sum(t^.R) + t^.Val; end;

{Xoa cay T}

procedure DelTree(var t: PNode); begin

if t = nil then exit; DelTree(t^.L); DelTree(t^.R); Dispose(t); t:= nil; end; procedure Test; var t: PNode; begin randomize; t:= GenTree(20);

write(nl, ' Day tang: '); LNRPrint(t); write(nl, ' Day giam: '); RNLPrint(t); write(nl,' Card = ',Card(t));

write(nl,' Sum = ',Sum(t)); writeln(nl,Count(t,1)); DelTree(t); LNRPrint(t); end; BEGIN writeln(nl,'==========================',nl); Test;

writeln(nl,' Finí); readln; END.

IIỊ4. Các ví dụ ứng dụng

Một phần của tài liệu MỘT số vấn đề về KIỂU dữ LIỆU TRỪU TƯỢNG (Trang 42)

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

(76 trang)
w