1 [Kinh nghiệm]Viết code cho B-Tree Wed Nov 30, 2011 8:21 pm
Admin
Quản trị viên
Chưa có thời gian viết, ở đây có cái khung. Anh chị em nào rỗi thì cứ cái khung này mà phệt, vì đang có việc bận nên bà con thông cảm. Mấy anh chị em trẻ cố gắng tự viết cho nó nhớ, chứ để mấy ông già viết thì cũng kỳ ghê cơ.
[You must be registered and logged in to see this link.]
- Code:
cây B-tree
/************************************************************************/
#define m 3 //Bậc của cây là 3 chẳng hạn
/************************************************************************/
//Cấu trúc của một Node trong B-Tree
typedef struct NODE
{
int key[m - 1];
int nKey; //Số khóa
NODE *pWay[m]; //Con trỏ đến các nhánh
NODE *pFather; //Con trỏ đến nút cha (nếu cần)
NODE *pLeft; //Con trỏ đến nút anh em bên trái (nếu cần)
NODE *pRight; //Con trỏ đến nút anh em bên phải (nếu cần)
}Node;
Node *tree; //B-tree
/************************************************************************/
/* Hàm khởi tạo cây */
/************************************************************************/
void InitTree()
{
//Khởi tạo null cho tree
}
/************************************************************************/
/* Thêm môt khóa mới vào cây */
/************************************************************************/
void InsertElement(int key)
{
//Thao tác thêm phần tử (Insert): thêm 1 khóa v vào cây
// [1] Duyệt cây để tìm kiếm vị trí của v cho đến khi gặp nút lá
// [2] Nếu nút lá có chứa khóa v thì không thêm, kết thúc hàm Insert
// ( Gọi nút lá là nút hiện tại)
// [3] Thêm khóa v vào nút hiện tại
// [4] Nếu nút hiện tại đầy
// [4.1] Tách nút hiện tại ra làm đôi
// [4.2] Nếu tồn tại nút cha, chuyển phần tử giữa lên nút cha
// [4.3] Nếu không (trường hợp ở gốc), tạo một nút cha chưa phần tử đó
// [4.4] Cập nhật lại con cho nút cha
// [4.5] Gọi nút cha là nút hiện tại
// [4.6] Quay lại [4]
// [5] Nếu không, kết thúc hàm Insert.
}
/************************************************************************/
/* Tìm kiếm Node chứa khóa */
/************************************************************************/
Node* SearchNode(int key)
{
//Duyệt cây cho đến khi gặp khóa
//Trả về con trỏ node chứa khóa
}
/************************************************************************/
/* Xóa một khóa khỏi cây */
/************************************************************************/
void DeleteElement(int key)
{
// Thao tác xóa phần tử (Delete): xóa 1 khóa v khỏi cây
// [1] Duyệt cây, cho đến khi gặp khóa chứa v. Gọi p là khóa chứa v
// [2] Nếu không thấy, kết thúc việc xóa.
// [3] Nếu v nằm giữa 2 cây con rỗng (v không có cây con) thì xóa phần tử v
// [4] Nếu v có cây con, thay thế v bằng:
// - phần tử lớn nhất trong cây con trái của v; đồng thời p trỏ đến node này
// - hoặc phần tử bé nhất trong cây con phải của v; đồng thời p trỏ đến node này
// [5] Nếu p có ít hơn [(m-1)/2] khóa:
// [5.1] Nếu nút anh em kế cận (trái hoặc phải) có dư khóa, thì “mượn” 1 khóa. Thao tác “mượn” là thao tác xoay trái (nếu mượn bên trái), xoay phải (nếu mượn bên phải). Đi đến bước [6]
// [5.2] Nếu không, tiến hành “sát nhập” với nút anh em kế cận, cùng với khóa tương ứng ở nút cha
// [5.3] p trỏ đến nút cha. Quay lại [5]
// [6] Kết thúc
}
/************************************************************************/
/* Xuất ra file */
/************************************************************************/
void Output(char *filename)
{
//Duyệt cây theo chiều rộng (BFS - Bread First Search)
//Ghi lên file theo đặc tả
}
/************************************************************************/
/* Ngoài ra có thể viết thêm một số hàm như….. */
/************************************************************************/
/************************************************************************/
/* Xoay trái */
/************************************************************************/
void RotateLeft(Node *p)
{
//….
}
/************************************************************************/
/* Xoay phải */
/************************************************************************/
void RotateRight(Node *p)
{
//…. }
//…
void main()
{
//Khởi tạo cây
//Xây dựng cây từ file input
//Thực hiện quá trình nhập khoá (insert)
// quá trình xuất khoá (delete)
//In ra file
}
[You must be registered and logged in to see this link.]