Để 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
}