Computer >> Máy Tính >  >> Lập trình >> C ++

Chương trình C ++ để triển khai Splay Tree

Đây là một chương trình C ++ để triển khai Splay Tree.

Mô tả lớp học:

 Begin class SplayTree có các chức năng:Tạo một hàm Splay () để triển khai cây splay từ trên xuống. Ở đây head.rch trỏ đến cây Left và head.lch trỏ đến cây bên phải. Tạo liên kết đến Cây phải. Tạo liên kết đến cây Trái. Ráp trái, giữa và phải cây. Tạo một hàm Insert () để chèn các nút vào cây. Nếu root-> k> =tất cả các khóa sẽ là gốc → lch Khác nếu root-> k <=tất cả các khóa sẽ là gốc → rch Khác Quay lại root.End 

Mô tả lớp và Mã giả:

 Begin Tạo cấu trúc s để khai báo biến k và con trỏ con trái lch và con trỏ con phải rch. Tạo một lớp SplayTree:Tạo một hàm RR_Rotate để xoay sang phải. Tạo một hàm LL_Rotate để xoay sang trái. Tạo một Splay chức năng để triển khai cây splay từ trên xuống. Ở đây head.rch trỏ đến cây Left và head.lch trỏ đến cây bên phải. Tạo liên kết đến Cây phải. Tạo liên kết đến cây Trái. Ráp trái, giữa và phải cây. Tạo một hàm New_Node () để tạo các nút trong cây. Tạo một hàm Insert () để chèn các nút vào cây. If root → k> =all key sẽ là root → lch Else if root-> k> =all key sẽ là root → rch Else Return root. Tạo một hàm Delete () để xóa các nút khỏi cây. Tạo một hàm Search () để tìm kiếm các nút trong cây. Tạo một hàm InOrder () để duyệt InOrder của cây. Tạo một hàm main () và thực hiện các lệnh gọi hàm chọn lọc theo lựa chọn. 

Mã mẫu

 #include  #include  #include  using namespace std; struct s // khai báo nút {int k; s * lch; s * rch;}; class SplayTree {public:s * RR_Rotate (s * k2) {s * k1 =k2-> lch; k2-> lch =k1-> rch; k1-> rch =k2; trả về k1; } s * LL_Rotate (s * k2) {s * k1 =k2-> rch; k2-> rch =k1-> lch; k1-> lch =k2; trả về k1; } s * Splay (int key, s * root) {if (! root) return NULL; tiêu đề s; header.lch =header.rch =NULL; s * LeftTreeMax =&tiêu đề; s * RightTreeMin =&header; while (1) {if (key  k) {if (! root-> lch) break; if (key  lch-> k) {root =RR_Rotate (root); if (! root-> lch) break; } RightTreeMin-> lch =root; RightTreeMin =RightTreeMin-> lch; root =root-> lch; RightTreeMin-> lch =NULL; } else if (key> root-> k) {if (! root-> rch) break; if (key> root-> rch-> k) {root =LL_Rotate (root); if (! root-> rch) break; } LeftTreeMax-> rch =root; LeftTreeMax =LeftTreeMax-> rch; root =root-> rch; LeftTreeMax-> rch =NULL; } khác phá vỡ; } LeftTreeMax → rch =root-> lch; RightTreeMin → lch =root-> rch; root-> lch =header.rch; root-> rch =header.lch; trả về gốc; } s * New_Node (int key) {s * p_node =new s; if (! p_node) {fprintf (stderr, "Hết bộ nhớ! \ n"); thoát ra (1); } p_node-> k =key; p_node-> lch =p_node-> rch =NULL; trả về p_node; } s * Insert (int key, s * root) {static s * p_node =NULL; if (! p_node) p_node =New_Node (key); else p_node-> k =key; if (! root) {root =p_node; p_node =NULL; trả về gốc; } root =Splay (key, root); if (key  k) {p_node-> lch =root-> lch; p_node-> rch =root; root-> lch =NULL; root =p_node; } else if (key> root-> k) {p_node-> rch =root-> rch; p_node-> lch =root; root-> rch =NULL; root =p_node; } else trả về gốc; p_node =NULL; trả về gốc; } s * Delete (int key, s * root) // xóa nút {s * temp; if (! root) // nếu cây trống return NULL; root =Splay (khóa, gốc); if (key! =root-> k) // nếu cây có một mục return root; else {if (! root-> lch) {temp =root; root =root-> rch; } else {temp =root; root =Splay (key, root-> lch); root-> rch =temp-> rch; } miễn phí (tạm thời); trả về gốc; }} s * Search (int key, s * root) // seraching {return Splay (key, root); } void InOrder (s * root) // inorder traversal {if (root) {InOrder (root-> lch); cout <<"key:" < k; if (root-> lch) cout <<"| left con:" < lch-> k; if (root-> rch) cout <<"| ngay con:" < rch-> k; cout <<"\ n"; InOrder (root-> rch); }}}; int main () {SplayTree st; s * gốc; root =NULL; st.InOrder (root); int i, c; while (1) {cout <<"1. Insert" <> c; switch © // thực hiện thao tác switch {case 1:cout <<"Nhập giá trị cần chèn:"; cin>> i; root =st.Insert (i, root); cout <<"\ nSau khi Chèn:" <> i; root =st.Delete (i, root); cout <<"\ nSau khi Xoá:" <> i; root =st.Search (i, root); cout <<"\ nSau khi Tìm kiếm" < 

Đầu ra

 1. Chèn 2. Xóa 3. Tìm kiếm4. ExitNhập giá trị bạn chọn:1Nhập giá trị cần chèn:7Sau khi chèn:7 phím:71. Insert2. Xóa 3. Tìm kiếm4. ExitNhập sự lựa chọn của bạn:1Nhập giá trị cần chèn:6Sau khi Chèn:6 phím:6 | con phải:7 phím:71. Insert2. Xóa 3. Tìm kiếm4. ExitNhập sự lựa chọn của bạn:1Nhập giá trị cần chèn:4Sau khi Chèn:4 phím:4 | con ngay:6key:6 | con phải:7 phím:71. Insert2. Xóa 3. Tìm kiếm4. ExitNhập sự lựa chọn của bạn:1Nhập giá trị cần chèn:5Sau khi Chèn:5 phím:4 phím:5 | con trái:4 | con ngay:6key:6 | con phải:7 phím:71. Insert2. Xóa 3. Tìm kiếm4. Thoát Nhập giá trị bạn chọn:1Nhập giá trị cần chèn:3Sau khi Chèn:3 phím:3 | con ngay:4key:4 | con phải:5 phím:5 | con ngay:6key:6 | con phải:7 phím:71. Insert2. Xóa 3. Tìm kiếm4. Thoát Nhập giá trị bạn chọn:1Nhập giá trị cần chèn:2A Sau khi Chèn:2 phím:2 | con ngay:3key:3 | con ngay:4key:4 | con phải:5 phím:5 | con ngay:6key:6 | con phải:7 phím:71. Insert2. Xóa 3. Tìm kiếm4. ThoátNhập sự lựa chọn của bạn:3Nhập giá trị cần tìm:2Sau Tìm kiếm 2 phím:2 | con ngay:3key:3 | con ngay:4key:4 | con phải:5 phím:5 | con ngay:6key:6 | con phải:7 phím:71. Insert2. Xóa 3. Tìm kiếm4. ExitNhập sự lựa chọn của bạn:2Nhập giá trị cần xóa:3Sau khi Xóa:3 phím:2 | con ngay:4key:4 | con phải:5 phím:5 | con ngay:6key:6 | con phải:7 phím:71. Insert2. Xóa 3. Tìm kiếm4. ExitEnter sự lựa chọn của bạn:4