NGUYỄN DUY PHƯƠNG 149Để thêm node vào cây nhị phân tìm kiếm ta cần xem xét những trường hợp sau:

Một phần của tài liệu Bài giảng Cấu trúc dữ liệu và giải thuật (2016): Phần 2 (Trang 25 - 27)

Để thêm node vào cây nhị phân tìm kiếm ta cần xem xét những trường hợp sau:

 Nếu cây rỗng thì node cần thêm chính là node gốc.

 Nếu cây không rỗng và node cần thêm có giá trị nhỏ hơn giá trị node gốc thì ta thêm node vào cây con bên trái. Ví dụ ta cần thêm node có giá trị 36 trên cây Hình 4.16.

 Nếu cây không rỗng và node cần thêm có giá trị lớn hơn giá trị node gốc thì ta thêm node vào cây con bên phải. Ví dụ ta cần thêm node có giá trị 55 trên cây Hình 4.16.

node* BST::insert(node* root, int value){//thêm node có giá trị value

if (root == NULL) //nếu cây rỗng

return newNode(value); //đây chính là node gốc

if (value < root ->data) //nếu điều này xảy ra

root ->left = insert(root ->left, value);//ta thêm vào cây con trái

else //trường hợp value>node->data

root ->right = insert(root ->right, value); //ta thêm vào cây con phải

return root;//trả lại node

}

Loại bỏ node trên cây nhị phân tìm kiếm:

Hình 4.17. Loại bỏ node trên cây tìm kiếm.

Để bảo toàn phép loại bỏ node trên cây nhị phân tìm kiếm ta cần xem xét đầy đủ các trường hợp sau:

Trường hợp 1: nếu cây rỗng thì phép loại bỏ hiển nhiên được bảo toàn.

Trường hợp 2: nếu node loại bỏ là node lá thì sau khi loại bỏ node ta vẫn nhận được một cây nhị phân tìm kiếm. Ví dụ ta loại bỏ các node có giá trị 15, 22 trên cây Hình 4.17.

NGUYỄN DUY PHƯƠNG 150

Trường hợp 3: nếu node loại bỏ chỉ có cây con phải. Ví dụ ta cần loại bỏ node p = 60 trên cây Hình 4.17. Trong trường hợp này ta chỉ việc liên kết node cha của p với nhánh cây con phải của p.

Trường hợp 4: nếu node loại bỏ chỉ có cây con trái. Ví dụ ta cần loại bỏ node p = 30 trên cây Hình 4.17. Trong trường hợp này ta chỉ việc liên kết node cha của p với nhánh cây con trái của p.

Trường hợp 5: nếu node loại bỏ có cả hai cây con. Ví dụ ta cần loại bỏ node 24 trên cây Hình 4.17. Trong trường hợp này ta được phép lấy node có giá trị lớn nhất thuộc nhánh cây con bên trái của node 24 (node 22) hoặc lấy node có giá trị nhỏ nhất thuộc nhánh cây con phải node 24 (node 26) thay thế vào node cần loại bỏ.

node*BST:: deleteNode(node* root, int value){//loại bỏ node có giá trị value

if (root == NULL) //nếu cây rỗng

return root;//không có gì để loại bỏ

if (value < root->data) //nếu node cần loại có giá trị nhỏ hơn node gốc

root->left = deleteNode(root->left, value); //tìm sang cây con trái để loại

else if (value > root->data) //nếu node cần loại có giá trị lớn hơn node gốc

root->right = deleteNode(root->right,value); //tìm sang cây con phải để loại

else { //Chú ý chỗ này: nếu tìm thấy node có giá trị valuecần loại bỏ if (root->left == NULL){ //nếu node cần loại chỉ có cây con phải

node *temp = root->right; free(root);

return temp;

}

else if (root->right == NULL) {//nếu node cần loại chỉ có cây con trái

node *temp = root->left; free(root);

return temp;

}

// trường hợp node có cả hai cây con

//ta lấy node trái nhất của cây con phải

node* temp = minValueNode(root->right);

root->data = temp->data; //thay thế nội dung node cần loại bỏ

root->right = deleteNode(root->right, temp->data);//loại bỏ node thay thế

}

return root; }

NGUYỄN DUY PHƯƠNG 151

Tìm node trên cây nhị phân tìm kiếm: phép tìm node có giá trị value trên cây tìm kiếm được thực hiện như sau:

 Nếu node cần tìm có giá trị lớn hơn nội dung node gốc thì ta tìm sang cây con bên phải.

 Nếu node cần tìm có giá trị bé hơn nội dung node gốc thì ta tìm sang cây con bên trái.

 Đưa ra kết luận tìm thấy node hay không tìm thấy node.

node*BST:: search(node* root, int value){ //tìm node có giá trị value trên cây

if (root == NULL || root->data == value) //nếu gốc rỗng hoặc tìm thấy node

return root; //trả lại node

if (root->data < value)//nếu node có giá trị bé hơn value

return search(root->right, value);//tìmở cây con phải

return search(root->left, value); //tìmở cây con trái

}

Một phần của tài liệu Bài giảng Cấu trúc dữ liệu và giải thuật (2016): Phần 2 (Trang 25 - 27)

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

(101 trang)