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

Chương trình C ++ để thực hiện xoay phải trên cây tìm kiếm nhị phân

Cây tìm kiếm nhị phân là một cây nhị phân được sắp xếp trong đó tất cả các nút có hai thuộc tính sau -

Cây con bên phải của một nút có khóa lớn hơn khóa của nút cha của nó.

Cây con bên trái của một nút có khóa nhỏ hơn hoặc bằng khóa của nút cha của nó.

Mỗi nút không được có nhiều hơn hai nút con.

Xoay cây là một thao tác làm thay đổi cấu trúc mà không can thiệp vào thứ tự của các phần tử trên cây nhị phân. Nó di chuyển một nút lên trên cây và một nút xuống dưới. Nó được sử dụng để thay đổi hình dạng của cây và giảm chiều cao của nó bằng cách di chuyển các cây con nhỏ hơn xuống và các cây con lớn hơn lên, dẫn đến cải thiện hiệu suất của nhiều hoạt động trên cây. Hướng của một vòng quay phụ thuộc vào phía mà các nút cây được dịch chuyển trong khi những người khác nói rằng nó phụ thuộc vào con nào chiếm vị trí của gốc. Đây là một chương trình C ++ để thực hiện Xoay Trái trên Cây Tìm kiếm Nhị phân.

Thuật toán

 Begin Tạo cấu trúc avl để khai báo dữ liệu biến d, con trỏ trái l và con trỏ phải r. Khai báo một lớp avl_tree để khai báo các hàm sau:height () - Để tính chiều cao của cây bằng hàm max. Difference () - Để tính toán sự khác biệt chiều cao của cây. rr_rotat () - Để xoay cây sang phải. ll_rotat () - Để xoay trái cây. lr_rotat () - Để xoay cây từ trái sang phải. rl_rotat () - Để xoay cây từ phải sang trái. balance () - Cân bằng cây bằng cách lấy hệ số cân bằng. Đặt sự khác biệt trong bal_factor. Nếu bal_factor> 1 cân bằng cây con bên trái. Nếu bal_factor <-1 cân bằng cây con bên phải. insert () - Để chèn các phần tử trong cây. show () - Để in cây. inorder () - Để in đường đi ngang của cây. preorder () - Để in đường đi ngang của cây. postorder () - Để in đường đi ngang của cây. Trong hàm main (), thực hiện thao tác chuyển đổi và gọi các hàm theo lựa chọn. 

Ví dụ

 #include  #include  #include  #include  #define pow2 (n) (1 <<(n)) using namespace std; struct avl {int d; struct avl * l; struct avl * r;} * r; class avl_tree {public:int height (avl *); int chênh lệch (avl *); avl * rr_rotat (avl *); avl * ll_rotat (avl *); avl * lr_rotat (avl *); avl * rl_rotat (avl *); số dư avl * (avl *); avl * insert (avl *, int); void show (avl *, int); void inorder (avl *); void đặt hàng trước (avl *); void postorder (avl *); avl_tree () {r =NULL; }}; int avl_tree ::height (avl * t) {int h =0; if (t! =NULL) {int l_height =height (t-> l); int r_height =height (t-> r); int max_height =max (l_height, r_height); h =max_height + 1; } return h;} int avl_tree ::difference (avl * t) {int l_height =height (t-> l); int r_height =height (t-> r); int b_factor =l_height - r_height; return b_factor;} avl * avl_tree ::rr_rotat (avl * cha) {avl * t; t =cha-> r; cha-> r =t-> l; t-> l =cha mẹ; cout <<"Xoay Phải-Phải"; return t;} avl * avl_tree ::ll_rotat (avl * cha) {avl * t; t =cha-> l; cha-> l =t-> r; t-> r =cha mẹ; cout <<"Left-Left Rotation"; return t;} avl * avl_tree ::lr_rotat (avl * cha) {avl * t; t =cha-> l; cha-> l =rr_rotat (t); cout <<"Xoay Trái-Phải"; return ll_rotat (cha);} avl * avl_tree ::rl_rotat (avl * cha) {avl * t; t =cha-> r; cha-> r =ll_rotat (t); cout <<"Xoay Phải-Trái"; return rr_rotat (cha);} avl * avl_tree ::balance (avl * t) {int bal_factor =difference (t); if (bal_factor> 1) {if (chênh lệch (t-> l)> 0) t =ll_rotat (t); khác t =lr_rotat (t); } else if (bal_factor <-1) {if (chênh lệch (t-> r)> 0) t =rl_rotat (t); else t =rr_rotat (t); } return t;} avl * avl_tree ::insert (avl * r, int v) {if (r ==NULL) {r =new avl; r-> d =v; r-> l =NULL; r-> r =NULL; trả về r; } else if (v  d) {r-> l =insert (r-> l, v); r =số dư (r); } else if (v> =r-> d) {r-> r =insert (r-> r, v); r =số dư (r); } return r;} void avl_tree ::show (avl * p, int l) {int i; if (p! =NULL) {show (p-> r, l + 1); cout <<""; if (p ==r) cout <<"Root ->"; for (i =0; i  d; show (p-> l, l + 1); }} void avl_tree ::inorder (avl * t) {if (t ==NULL) return; inorder (t-> l); cout < d <<""; inorder (t-> r);} void avl_tree ::preorder (avl * t) {if (t ==NULL) return; cout < d <<""; đặt hàng trước (t-> l); preorder (t-> r);} void avl_tree ::postorder (avl * t) {if (t ==NULL) return; đơn đặt hàng (t -> l); đơn đặt hàng (t -> r); cout < d <<"";} int main () {int c, i; avl_tree avl; while (1) {cout <<"1. Chèn phần tử vào cây" <> c; switch (c) {case 1:cout <<"Nhập giá trị cần chèn:"; cin>> i; r =avl.insert (r, i); phá vỡ; case 2:if (r ==NULL) {cout <<"Tree is Empty" < 

Đầu ra

 1.Chèn phần tử vào tree2.show Balanced AVL Tree3.InOrder traversal4.PreOrder traversal5.PostOrder traversal6.ExitEnter your Choice:1Nhập giá trị cần chèn:131.Chèn phần tử vào tree2.show Balanced AVL Tree3.InOrder traversal4 .PreOrder traversal5. . Chèn Phần tử vào tree2.show Balanced AVL Tree3.InOrder traversal4.PreOrder traversal5.PostOrder traversal6.ExitEnter your Choice:1 Nhập giá trị cần chèn:51. Chèn phần tử vào tree2.show Balanced AVL Tree3.InOrder traversal4.PreOrder traversal5. PostOrder traversal6.ExitEnter your Choice:1Nhập giá trị được chèn:111.Insert Element vào tree2.show Balanced AVL Tree3.InOrder traversal4.PreOrder traversal5.PostOrder traversal6.ExitEnter your Choice:1Enter giá trị được chèn:4Left-Left Rotation1. Chèn phần tử vào tree2.show Balanced AVL Tree3.InOrder traversal4.PreOrder traversal5. AVL Tree3.InOrder traversal4.PreOrder traversal5.PostOrder traversal6.ExitEnter your Choice:1Nhập giá trị cần chèn:161.Insert Element vào tree2.show Balanced AVL Tree3. :4 5 8 10 11 13 15 161.Chèn phần tử vào cây2. Hiển thị Balanced AVL Tree3.InOrder traversal4.PreOrder traversal5. tree2.show Balanced AVL Tree3.InOrder traversal4.PreOrder traversal5.PostOrder traversal6.ExitEnter your Choice:5Postorder Traversal:4 8 5 11 16 15 13 101. traversal5.PostOrder traversal6.ExitEnter your Choice:1Nhập giá trị cần chèn:141.Chèn phần tử vào tree2.show Balanced AVL Tree3.InOrder traversal4.PreOrder traversal5.PostOrder traversal6.ExitEnter your Choice:1Nhập giá trị được chèn:31 Phần tử vào tree2.show Balanced AVL Tree3.InOrder traversal4.PreOrder traversal5. .ExitEnter your Choice:1 Nhập giá trị cần chèn:91. Chèn phần tử vào tree2.show Balanced AVL Tree3.InOrder traversal4.PreOrder traversal5.PostOrder traversal6.ExitEnter your Choice:1 Giá trị nhập để chèn:52Right-Right Rotation1.Insert Element vào tree2.show Balanced AVL Tree3.InOrder traversal4.PreOrder traversal5.PostOrder traversal6.ExitEnter your Choice:6