Để cây cân bằng sau khi thực hiện việc thêm, xóa ta cần các phép toán cânbằng cây: quay trái, quay phải.. Phép quay cây giúp cây cân bằng sau khi thực hiện các phép thêm hoặc xóa.Phép qu
Khái niệm cây AVL
Cây AVL là một loại cây tìm kiếm nhị phân tự cân bằng, phát triển từ cây nhị phân tìm kiếm (BST), cho phép thực hiện các thao tác thêm, xóa và tìm kiếm với thời gian O(log n) Trong cây AVL, chiều cao của hai cây con tại mỗi node không được chênh lệch quá 1, đảm bảo tính cân bằng Để duy trì sự cân bằng sau khi thực hiện các phép toán, cần áp dụng các thao tác như quay trái và quay phải Hệ số cân bằng của một node, được xác định bằng hiệu chiều cao của cây con bên trái và bên phải, là chỉ số quan trọng để đánh giá trạng thái cân bằng của cây.
Hệ số cân bằng = chiều cao con trái – chiều cao con phải a Phép quay cây:
Bao gồm 2 phép quay cây: quay trái, quay phải.
Phép quay cây là kỹ thuật giúp cây dữ liệu duy trì sự cân bằng sau khi thực hiện các phép thêm hoặc xóa Kỹ thuật này chuyển đổi một nút cha thành nút con, đồng thời bảo toàn thứ tự các nút trong cây Cụ thể, phép quay trái là một trong những phương pháp quan trọng trong quá trình này.
H ÌNH 1-1 THỰ HIỆN PHÉP QUAY TRÁI
Trong cây nhị phân, khi thực hiện phép quay trái với node gốc (z) và node con (y), node (y) trở thành gốc mới, trong khi (z) trở thành con trái của (y) Để duy trì cấu trúc của cây, trước khi thực hiện phép quay, chúng ta chuyển con trái của (y) thành con phải của (z) Cuối cùng, chúng ta gán con trái của (y) bằng (z) để hoàn thiện cấu trúc cây nhị phân.
Thực hiện phép quay trái trong C# ii Phép quay phải:
H ÌNH 1-2 THỰC HIỆN PHÉP QUAY PHẢI
Khi thực hiện phép quay trong cây nhị phân, ta có node gốc là (z) và con trái là (y) Phép quay này sẽ chuyển node (y) thành node gốc và node (z) thành con phải của (y) Để duy trì cấu trúc của cây nhị phân, trước khi thực hiện quay, ta cần chuyển con phải của (y) thành con trái của (z) Cuối cùng, ta gán con trái của (y) bằng (z), tạo ra cấu trúc như hình trên.
Ta thực hiện phép quay trái trong C# b Phép thêm và tính cân bằng của cây
Cây AVL là cây nhị phân tự cân bằng, để duy trì sự cân bằng của cây khi thêm, ta sử dụng các phép quay để cây cân bằng.
Cấu trúc của một node trong cây:
Con trái và con phải.
Để thêm một node mới vào cây, trước tiên cần thực hiện như trong cây nhị phân thông thường Tuy nhiên, việc này có thể dẫn đến tình trạng cây bị mất cân bằng.
Tiếp theo ta cập nhật chiều cao cho node mới thêm và di chuyển lên dần lên gốc cây để cập nhật chiều cao cho từng node.
Để kiểm tra sự mất cân bằng của node hiện tại, cần thực hiện các phép quay nhằm duy trì sự cân bằng cho cây Có bốn loại phép quay cơ bản: quay trái, quay phải, quay trái-phải và quay phải-trái.
Lặp lại các bước trên từ node mới thêm đến gốc cho đến khi cây cân bằng.
Tính cân bằng của cây:
H ÌNH 1-3 THỰC HIỆN PHÉP QUAY CÂY KHI CÂY LỆCH PHẢI
Khi cây ở trạng thái cân bằng và thêm lực (F) vào, cây sẽ mất cân bằng tại nút (B) với hệ số cân bằng là -2 Điều này cho thấy chiều cao của con trái nhỏ hơn chiều cao của con phải, và lực (F) lớn hơn con trái (D) của (B), dẫn đến cây bị lệch về phía phải Để khôi phục trạng thái cân bằng, chúng ta thực hiện phép quay trái tại nút (B).
H ÌNH 1-4 THỰC HIỆN PHÉP QUAY CÂY KHI CÂY LỆCH TRÁI
Khi cây đang ở trạng thái cân bằng, việc thêm (A) vào cây sẽ làm mất cân bằng tại node (E), với hệ số cân bằng của (E) là 2 Điều này cho thấy chiều cao của con trái lớn hơn chiều cao con phải, và (A) nhỏ hơn con phải của (E) là (C), dẫn đến cây bị lệch trái Để khôi phục trạng thái cân bằng, cần thực hiện phép quay phải tại node (E).
Cây lệch trái phải-trái:
H ÌNH 1-5 THỰC HIỆN PHÉP QUAY CÂY KHI CÂY LỆCH PHẢI - TRÁI
Khi cây ở trạng thái cân bằng và ta thêm một nút (F), cây sẽ mất cân bằng tại nút (C) với hệ số cân bằng là -2, cho thấy chiều cao con trái nhỏ hơn chiều cao con phải Vì (F) nhỏ hơn con trái (G) của (C), cây sẽ lệch phải-trái Để khôi phục trạng thái cân bằng, cần thực hiện phép quay kép: quay phải tại nút (G) và sau đó quay trái tại nút (C).
H ÌNH 1-6 THỰC HIỆN PHÉP QUAY CÂY KHI CÂY LỆCH TRÁI PHẢI -
Khi cây ở trạng thái cân bằng và thêm nút (E), cây sẽ mất cân bằng tại node (F) với hệ số cân bằng là 2 Điều này cho thấy chiều cao của con trái (B) nhỏ hơn chiều cao của con phải, dẫn đến tình trạng lệch trái-phải Để khôi phục sự cân bằng, cần thực hiện phép quay kép: quay trái tại node (B) và sau đó quay phải tại node (F).
Quá trình xóa nút khỏi cây AVL có thể làm mất sự cân bằng của cây Phép xóa trên cây AVL tương tự như trên cây nhị phân tìm kiếm (BST) và bao gồm ba trường hợp: nút lá, nút có một con và nút có hai con.
Node lá ta chỉ cần xóa trực tiếp node đó, node có một con ta chỉ cần lấy node con của node đó thế chỗ node cha.
Khi một node có hai con, cần tìm node lớn nhất ở cây con bên trái hoặc nhỏ nhất ở cây con bên phải để thay thế Sau đó, gán dữ liệu của node thế mạng vào node cần xóa và tiến hành xóa node thế mạng trong cây con.
Sau đó ta tiến hành cập nhật lại chiều cao cho các node cha từ node đã được xóa cho đến node gốc.
Để kiểm tra sự cân bằng của cây, chúng ta cần xem xét hệ số cân bằng của từng node từ node cha đến node gốc Nếu phát hiện cây mất cân bằng, chúng ta sẽ thực hiện các phép quay nhằm khôi phục trạng thái cân bằng cho cây.
Khi xóa cây sẽ bị một trong bốn trường hợp sau:
H ÌNH 1-7 THỰC HIỆN PHÉP QUAY CÂY KHI CÂY LỆCH TRÁI SAU KHI XÓA
Khi cây ở trạng thái cân bằng và thực hiện xóa nút (E), cây sẽ bị mất cân bằng tại nút (D) với hệ số cân bằng là 2 Để khôi phục sự cân bằng của cây, ta cần thực hiện phép quay phải tại nút (D).
H ÌNH 1-8 THỰC HIỆN PHÉP QUAY CÂY KHI CÂY LỆCH PHẢI SAU KHI XÓA
Khi cây ở trạng thái cân bằng và thực hiện xóa node (A), cây sẽ bị mất cân bằng tại node (B) với hệ số cân bằng là -2 Để khôi phục sự cân bằng cho cây, ta cần thực hiện phép quay trái tại node (B).
H ÌNH 1-9 THỰC HIỆN PHÉP QUAY CÂY KHI CÂY LỆCH PHẢI - TRÁI SAU KHI XÓA
Giao diện
Giao diện chính của ứng dụng Gồm thanh chức năng, ô thông tin chi tiết và danh sách sinh viên.
Thanh menustrip cung cấp các chức năng quan trọng như thêm, xóa, cập nhật thông tin, tìm kiếm, lưu và thoát, giúp người dùng thao tác một cách dễ dàng và hiệu quả.
Thông tin chi tiết: sử dụng các label, textbox và radio button để hiển thị thông tin sinh viên, các thông tin này được lấy từ datagridview.
Danh sách sinh viên: sử dụng datagridview để hiển thị danh sách sinh viên từ lớp cơ sở dữ liệu.
Ứng dụng cung cấp chức năng thêm sinh viên thông qua nút "Thêm" trên thanh menustrip Khi nhấn nút này, form thêm sẽ xuất hiện, cho phép người dùng nhập thông tin sinh viên vào các textbox và chọn giới tính Sau khi nhấn nút thêm, hệ thống sẽ hiển thị thông báo thành công hoặc thất bại Nếu thêm thành công, form sẽ tự động đóng và sinh viên vừa được thêm sẽ hiển thị trong danh sách trên form chính Để quay lại form chính, người dùng chỉ cần nhấn nút "Quay lại" trên thanh menustrip.
Để thực hiện chức năng xóa trong giao diện của form thêm, người dùng chỉ cần nhấp chuột vào nút xóa trên thanh menustrip Sau đó, form xóa sẽ hiển thị để tiến hành chức năng này.
Để xóa một sinh viên, người dùng cần chọn sinh viên trong danh sách hiển thị trên datagridview Thông tin chi tiết của sinh viên sẽ được trình bày ở phần trên Sau khi xác nhận sinh viên muốn xóa, người dùng nhấn nút xóa và ứng dụng sẽ thông báo kết quả xóa thành công hoặc thất bại Để cập nhật thông tin sinh viên, người dùng chỉ cần nhấn vào nút cập nhật thông tin trên thanh menustrip, sau đó form cập nhật thông tin sẽ xuất hiện.
Để cập nhật thông tin cho một sinh viên, người dùng chỉ cần chọn sinh viên từ danh sách hiển thị trên datagridview Sau đó, nhập thông tin cần chỉnh sửa vào ô thông tin chi tiết và nhấn nút cập nhật để hoàn tất Để thoát khỏi form, chỉ cần nhấn nút quay lại để trở về form chính.
Có 3 kiểu tìm kiếm Chọn kiểu tìm kiếm ta click chuột vào nút tìm kiếm trên thanh menustrip và chọn kiểu tìm kiếm tương ứng.
H ÌNH 3-15 CỬA SỔ TÌM KIẾM
Khi chọn được kiểu tìm kiếm form tìm kiếm theo kiểu tương ứng sẽ hiện lên.
Để tìm kiếm theo mã số, người dùng chỉ cần nhập mã số vào thanh tìm kiếm và nhấn nút tìm Nếu mã số tồn tại, hệ thống sẽ hiển thị thông tin sinh viên trong datagridview cùng với thông tin chi tiết của sinh viên đó Ngược lại, nếu mã số không tồn tại, hệ thống sẽ thông báo rằng mã không tồn tại.
H ÌNH 3-16 CỬA SỔ TÌM KIẾM THEO MÃ SỐ
Để tìm kiếm theo lớp, người dùng nhập tên lớp vào thanh tìm kiếm và nhấn nút tìm kiếm Nếu lớp học tồn tại, hệ thống sẽ hiển thị tất cả sinh viên trong lớp đó trên datagridview Ngược lại, nếu không tìm thấy, danh sách sẽ trả về rỗng Để thoát khỏi form, người dùng chỉ cần nhấn nút quay lại để trở về form chính.
Để tìm kiếm sinh viên theo tên, người dùng nhập tên vào thanh tìm kiếm và nhấn nút tìm kiếm Nếu có kết quả, hệ thống sẽ hiển thị tất cả sinh viên có tên trùng khớp trên datagridview; nếu không, sẽ trả về danh sách rỗng Để thoát khỏi form, người dùng chỉ cần nhấn nút quay lại để trở về form chính.
Hình 3-18 hiển thị cửa sổ tìm kiếm theo tên Để lưu file, người dùng chỉ cần nhấn nút lưu file trên menu và chọn "Yes" Nếu quá trình lưu file thành công, ứng dụng sẽ thông báo rằng việc lưu file đã thành công; ngược lại, nếu lưu thất bại, ứng dụng sẽ thông báo rằng lưu file không thành công.
H ÌNH 3-19 QUÁ TRÌNH LƯU DỮ LIỆU f Thoát Để thoát file ta click chuột vào nút thoát trên menustrip Ứng dụng sẽ đóng và lưu file hiện tại.
Xử lý
Để thao tác trên giao diện, cần viết mã để thực hiện các chức năng tương ứng Chúng ta sẽ tạo một lớp xử lý với các hàm thực hiện chức năng và trả về giá trị true khi thành công, false khi thất bại Lớp xử lý này sẽ có các thuộc tính riêng.
Thuộc tính “dssv” dùng lưu trữ danh sách sinh viên.
Phương thức khởi tạo kết nối lớp xử lý với lớp cơ sở dữ liệu qua biến data Để thực hiện chức năng thêm, chúng ta chờ sự kiện click vào nút thêm; khi sự kiện này xảy ra, hàm thêm trong lớp xử lý sẽ được gọi Nếu quá trình thêm thành công, hệ thống sẽ thông báo thành công, ngược lại sẽ thông báo thất bại.
Hàm thêm trong lớp xử lý
Trước tiên, kiểm tra mã sinh viên có tồn tại trong danh sách hay không Nếu mã đã tồn tại, hàm sẽ trả về false, nghĩa là việc thêm sinh viên thất bại Ngược lại, nếu mã chưa có, chúng ta sẽ thêm sinh viên vào danh sách và trả về true Cần viết thêm cấu trúc try … catch để xử lý các trường hợp ngoại lệ Để thoát khỏi form thêm, người dùng cần nhấn nút quay lại, và khi nhấn, sự kiện của nút sẽ được thực hiện.
Chúng ta sẽ thông báo cho form chính biết rằng form thêm đã được đóng thông qua delegate dongFormTen() Để thực hiện chức năng xóa, chúng ta sẽ chờ sự kiện click chuột vào nút xóa Khi nhận được sự kiện này, hàm xóa trong lớp xử lý sẽ được gọi Nếu quá trình xóa thành công, một thông báo thành công sẽ được hiển thị; ngược lại, nếu thất bại, thông báo thất bại sẽ xuất hiện Mã sinh viên sẽ được lấy từ textbox mã số của sinh viên, và sau đó, ứng dụng sẽ cập nhật và hiển thị lại danh sách sinh viên qua datagridview trong form xóa.
Trong lớp xử lý, hàm xóa sinh viên duyệt qua danh sách, xóa sinh viên nếu tìm thấy và trả về true, ngược lại trả về false Sử dụng cấu trúc try…catch… để xử lý ngoại lệ Để quay lại form chính, người dùng chỉ cần nhấn nút quay lại, sự kiện sẽ đóng form và thông báo cho form chính qua delegate dongFormXoa() Chức năng cập nhật thông tin được thực hiện khi người dùng click nút cập nhật; nếu thành công, thông báo sẽ hiển thị thành công, nếu thất bại sẽ hiển thị thông báo thất bại Thông tin cập nhật được lấy từ các textbox trong ô thông tin chi tiết sinh viên và từ datagridview thông qua sự kiện CellEnter, sau đó hiển thị thông tin mới trên datagridview.
Để cập nhật thông tin sinh viên trong lớp xử lý, ta sử dụng vòng lặp để kiểm tra xem mã số sinh viên cần sửa có tồn tại trong danh sách hay không Nếu tìm thấy, ta sẽ ghi đè tất cả thông tin hiện tại và trả về giá trị true; ngược lại, nếu không tìm thấy, ta trả về false Để tránh các ngoại lệ, chúng ta sử dụng cấu trúc try…catch… Trong khi đó, chức năng tìm kiếm yêu cầu người dùng click chuột vào chức năng tìm kiếm tương ứng để thực hiện.
H ÌNH 4-21 CỬA SỔ CÁC CHỨC NĂNG TÌM KIẾM
Khi lựa chọn kiểu tìm kiếm, form tìm kiếm tương ứng sẽ được kích hoạt Ứng dụng sử dụng cây AVL để thực hiện tìm kiếm, tạo ra một cây AVL phù hợp với chức năng này Kết quả tìm kiếm sẽ được trả về dưới dạng danh sách và được hiển thị qua datagridview.
Hàm tìm kiếm trong lớp xử lý:
Trước tiên khởi tạo một cây AVL Cây AVL thích hợp sẽ được chọn thông qua kiểu enum. public enum KieuTimKiem { Maso, Ten, Lop }
Khi cây rỗng, chúng ta sẽ khởi tạo cây AVL bằng cách thêm tất cả sinh viên hiện tại từ danh sách vào cây Việc khởi tạo chỉ cần thực hiện trong lần tìm kiếm đầu tiên, các lần tìm kiếm sau chỉ cần thực hiện tìm kiếm mà không cần khởi tạo lại cây Để lưu file, người dùng chỉ cần nhấp chuột vào nút lưu file trên thanh menustrip.
Khi người dùng nhấn nút lưu file, ứng dụng sẽ hiển thị thông báo yêu cầu xác nhận Người dùng có thể chọn “yes” để tiếp tục lưu file hoặc “no” để hủy bỏ thao tác lưu.
Hàm lưu file trong lớp cơ sở dữ liệu được gọi
Để lưu trữ danh sách sinh viên, cần thêm cú pháp Serializable vào trước lớp sinh viên Để thoát khỏi ứng dụng, người dùng chỉ cần nhấp vào nút thoát trên thanh menustrip, khi đó sự kiện thoát sẽ được kích hoạt.
Trước khi thoát ứng dụng, cần lưu file vào thư mục bin và gọi phương thức Close() để đóng ứng dụng Để hiển thị dữ liệu trên các datagridview trong các form, ta định dạng DataPropertyName của các cột trùng với tên các property của lớp sinh viên Danh sách sinh viên được gán vào property DataSource của datagridview để hiển thị Khi mở ứng dụng, việc đọc file từ lớp cơ sở dữ liệu sẽ giúp hiển thị danh sách sinh viên.
Liên kết cây AVL với danh sách sinh viên
Ứng dụng sử dụng cây AVL để tìm kiếm sinh viên, tận dụng ưu điểm của cấu trúc này với thời gian tìm kiếm trung bình nhanh hơn so với tìm kiếm tuyến tính thông thường Để thực hiện chức năng tìm kiếm, cần thiết kế một lớp cây AVL để lưu trữ thông tin về các sinh viên, bắt đầu từ việc xây dựng lớp node.
Trước khi xây dựng cây AVL ta xây dựng lớp lưu các node cho cây:
Các thuộc tính của lớp node:
Các phương thức của lớp:
Sử dụng kiểu object để lưu key, vì ta có 3 kiểu tìm kiếm nên các key lưu trữ của từng kiểu tìm kiếm sẽ có kiểu khác nhau.
Danh sách được sử dụng để lưu trữ thông tin về các sinh viên có tên tương tự hoặc danh sách sinh viên trong cùng một lớp Tùy thuộc vào kiểu tìm kiếm của người dùng, thuộc tính này sẽ phục vụ các mục đích khác nhau Tuy nhiên, khi tìm kiếm theo mã số sinh viên, thuộc tính này sẽ không được áp dụng, vì tìm kiếm theo mã số chỉ trả về thông tin của một sinh viên duy nhất.
Phương thức khởi tạo cho cây AVL sử dụng biến loại (enum) để phân biệt các kiểu tìm kiếm, giúp tối ưu hóa việc tìm kiếm trong nhiều trường hợp khác nhau Tùy thuộc vào kiểu tìm kiếm, cấu trúc của node sẽ được tạo ra khác nhau, đảm bảo tính linh hoạt và hiệu quả trong quá trình xây dựng cây AVL.
Sau khi xây dựng lớp node, chúng ta tiến hành xây dựng cây AVL để phục vụ cho việc tìm kiếm sinh viên Để phù hợp với mục đích ứng dụng, cây AVL cần được tùy chỉnh Theo lý thuyết, lớp cây AVL sẽ bao gồm các thuộc tính để lưu trữ các node và các phương thức cơ bản như quay trái, quay phải, thêm, xóa và tìm kiếm.
Tổng quan của cây AVL trong ứng dụng:
Phương thức thêm của cây AVL:
Ứng dụng có ba kiểu tìm kiếm, do đó cần tùy chỉnh phương thức thêm để tạo ra một cây AVL phù hợp với mục đích tìm kiếm của người dùng Để thêm một node vào cây AVL, ta sử dụng biến “loai” có kiểu enum đã được định nghĩa, nhằm tạo ra node phù hợp Bằng cách áp dụng lý thuyết và điều chỉnh cấu trúc của phương thức thêm, ta có thể phát triển phương thức thêm tương thích với yêu cầu của ứng dụng.
Các phương thức thêm node mới và tùy chỉnh tính cân bằng của cây được thực hiện theo lý thuyết, nhưng hàm so sánh giá trị giữa các key khác với cây AVL thông thường Để so sánh giá trị giữa các node, chúng ta sử dụng hàm so sánh được thiết kế trong lớp “Xu_Ly_Chuoi” nhằm lấy giá trị phù hợp với loại cây và thực hiện so sánh.
Lớp xử lý chuỗi được tối ưu hóa cho cây AVL, cho phép tìm kiếm sinh viên qua tên, mã số, hoặc lớp Khi tìm kiếm theo tên, ứng dụng chỉ so sánh phần tên cần thiết, ví dụ chỉ lấy "An" từ "Nguyễn Văn An" Tìm kiếm theo mã số sẽ chỉ trả về mã số tương ứng Đối với tìm kiếm theo lớp, phương thức so sánh trong lớp "String" được sử dụng Việc xây dựng cây AVL để tìm kiếm theo mã số không khác biệt so với cây AVL thông thường, nhưng cần điều chỉnh cách lưu trữ khi tìm kiếm theo tên hoặc lớp Nếu thêm sinh viên có tên trùng với sinh viên đã có trong cây, hệ thống sẽ xử lý để tránh xung đột.
Khi thêm một sinh viên vào cây AVL, nếu lớp của sinh viên đó đã tồn tại, chúng ta chỉ cần cập nhật danh sách thuộc tính của node hiện tại thay vì tạo một node mới Điều này giúp tối ưu hóa quá trình tìm kiếm và trả về danh sách sinh viên một cách hiệu quả.
Phương thức xóa trong cây AVL áp dụng lý thuyết để thực hiện việc loại bỏ nút Hàm so sánh giá trị giữa các nút được sử dụng tương tự như trong phương thức thêm.
Để hỗ trợ việc xóa trong cây AVL, cần thêm một hàm chuyên dụng Khi xóa sinh viên từ form, nếu cây AVL đã được khởi tạo, chúng ta phải xóa sinh viên tương ứng khỏi cây Khi tìm kiếm theo lớp và tên, ứng dụng sẽ trả về danh sách sinh viên, trong đó mỗi node lưu trữ một danh sách Khi xóa một node, đồng nghĩa với việc xóa luôn danh sách đó Nếu node lưu một sinh viên duy nhất trong lớp, chúng ta có thể xóa node đó Ngược lại, nếu node chứa từ hai sinh viên trở lên, chỉ cần xóa sinh viên có mã số tương ứng trong danh sách.
Phương thức tìm kiếm của cây:
Thực hiện tìm kiếm như bình thường, tuy nhiên tùy theo loại tìm kiếm kiểu trả về khác nhau:
Tìm theo mã trả về sinh viên.
Tìm theo tên trả về danh sách các sinh viên có tên gần giống nhau. Tìm theo lớp trả về danh sách các sinh viên có trong lớp đó.
Phương thức tìm kiếm trong ứng dụng được xây dựng dựa trên lý thuyết đã nêu, với việc tùy chỉnh thông qua biến “loai” để trả về kết quả phù hợp với kiểu tìm kiếm của người dùng Nếu tìm kiếm theo tên, phương thức sẽ trả về sinh viên chứa mã số tương ứng Ngược lại, nếu tìm kiếm theo tên hoặc lớp, phương thức sẽ cung cấp danh sách các sinh viên liên quan Hàm so sánh giá trị giữa các node được áp dụng tương tự như trong phương thức thêm Cuối cùng, cây AVL được liên kết vào danh sách sinh viên để quản lý dữ liệu hiệu quả hơn.
Cây AVL được khởi tạo chỉ khi thực hiện tìm kiếm và chỉ được tạo ra một lần duy nhất Để đảm bảo điều này, chúng ta áp dụng mẫu singleton cho cây AVL Lớp này sẽ lưu trữ ba cây AVL khác nhau, và tùy thuộc vào kiểu tìm kiếm, cây AVL tương ứng sẽ được khởi tạo và quản lý thông qua một biến duy nhất.
Trong quá trình tìm kiếm, danh sách sinh viên từ cơ sở dữ liệu được sử dụng để khởi tạo cây AVL, với việc sử dụng vòng lặp để thêm từng sinh viên vào cây thông qua phương thức của lớp xử lý Để đảm bảo tính đồng nhất dữ liệu sau khi khởi tạo cây, khi người dùng thực hiện các thao tác thêm, xóa hoặc cập nhật thông tin, lớp xử lý sẽ kiểm tra điều kiện cụ thể Cụ thể, khi thêm một sinh viên mới, cây AVL đã được khởi tạo sẽ được xác định, và sinh viên sẽ được thêm vào cây tương ứng thông qua hàm “xuLyCayAvl”, được gọi trong sự kiện thêm của Form.
Khi thực hiện xóa một sinh viên, chúng ta cần gọi hàm "xuLyCayAvl" trong sự kiện xóa để đảm bảo dữ liệu được đồng bộ hóa chính xác.
(Data.Cây_AVL.Data_AVL.instance.Avl_Maso().root != if null )
Data.Cây_AVL.Data_AVL.instance.Avl_Maso().Delete< string >( ref
Data.Cây_AVL.Data_AVL.instance.Avl_Maso().root, txtMaSo.Text);
(Data.Cây_AVL.Data_AVL.instance.Avl_Lop().root != if null )
Data.Cây_AVL.Data_AVL.instance.Avl_Lop().Delete< string >( ref
Data.Cây_AVL.Data_AVL.instance.Avl_Lop().root, txtLop.Text, GetSinhVien(), KieuTimKiem.Lop);
Data.Cây_AVL.Data_AVL.instance.Avl_Ten().Delete< string >( ref
Data.Cây_AVL.Data_AVL.instance.Avl_Ten().root, txtHoTen.Text, GetSinhVien(), KieuTimKiem.Ten);
Để đồng bộ dữ liệu khi cập nhật thông tin, chúng ta sử dụng hàm “Update” trong lớp cây AVL Hàm này chỉ áp dụng cho cây AVL lưu trữ key là mã số, do các node của cây chỉ lưu trữ một đối tượng duy nhất.
Còn với cây AVL lưu trữ danh sách trong node, ta phải gọi hàm xóa rồi thêm lại thông tin sinh viên mới sau khi được cập nhật.