Các node (hay các phần tử) của cây đều không tự sinh ra. Vì thế mà khi có một cây nhị phân tìm kiếm, việc đầu tiên ta cần thao tác đó là thêm phần tử vào cây đó trước sau đó mới thực hiện được một số thao tác như: duyệt, tìm kiếm, xóa…

Để thực hiện thêm phần tử vào một cây nhị phân tìm kiếm ta cần tuân theo điều kiện đó là nếu: node được thêm vào bé hơn node gốc sẽ được đặt vào bên trái node gốc, node được thêm vào lớn hơn node gốc sẽ được đặt vào bên phải node gốc.

1.Cách thêm phần tử vào trong cây nhị phân

Việc thêm một node p vào cây phải bảo đảm điều kiện ràng buộc của cây nhị phân tìm kiếm. Cách để ta thêm một phần tử vào trong cây nhị phân tìm kiếm đó là ta sẽ đi kiểm tra khóa (hay data) của 2 node đó là node proot sau đó ta sử dụng đệ quy cho từng trường hợp như sau:

  • Đầu tiên ta sẽ kiểm tra điều kiện của node root, nếu như node root rỗng thì ta gán luôn root = p . Ngược lại, không rỗng thì thực hiện các bước bên dưới:
    • Nếu như p->data > root->data , nghĩa là data của node p nhỏ hơn data của node root thì gọi đệ quy lại quá trình chèn ở cây con phải.
    • Nếu như p->data < root->data , nghĩa là data của node p lớn hơn data của node root thì gọi đệ quy lại quá trình chèn ở cây con trái.
    • Nếu như root->data = p->data , nghĩa là data của node p bằng với data của node root thì dừng lại quá trình đệ quy.

Để hiểu rõ hơn về các bước trên, mời bạn đọc xem ví dụ dưới đây minh họa việc thêm một phần tử vào trong cây nhị phân tìm kiếm.

2.Hàm thêm phần tử vào trong cây nhị phân

Hàm thêm phần tử vào trong cây sẽ là một hàm đệ quy vì trong quá trình thêm phần tử sẽ gọi lại chính hàm này để thêm phần tử vào trong cây theo đúng quy tắc của cây nhị phân tìm kiếm.

Hàm int InsertNode(Tree &root, Node *p) dưới đây nhận đầu vào là node gốc Tree &root Node *p là phần tử cần thêm vào cây:

int InsertNode(Tree &root, Node*p){
    //neu node root khac rong thi thuc hien them vao cay
    if (root != NULL){
        //neu 2 data cua 2 node bang nhau thi ket thuc
        if (root->data==p->data){
            return 0;
        }
        //neu khoa cua root lon hon khoa cua p thi goi de quy trai
        if (root->data > p->data){
            return InsertNode(root->left, p);
        }
        else{//neu khoa cua root nho hon khoa cua p thi goi de quy phai
            return InsertNode(root->right,p);
        }
    }else { //truong hop neu node root la rong thi them node p vao node root
        root = p;
    }
}

Hàm trên khi được gọi ra sẽ thực hiện thêm 1 phần tử vào trong cây nhị phân tìm kiếm. Tuy nhiên để thực hiện cho việc thêm nhiều phần tử vào trong cây ta sẽ đi xây dựng một hàm sử dụng lại hàm InsertNode() ở trên để thực hiện thêm N phần tử vào trong cây!

Ta sẽ đi xây dựng một hàm void Input(Tree &root) nhận đầu vào là node gốc Tree &root sau đó thực hiện nhập vào N phần tử cho cây ở trong vòng lặp và thông qua hàm InsertNode(root,p)

void Input(Tree &root){
    int n;
    printf ("NHAP SO LUONG NODE CAN THEM: ");
    scanf("%d",&n);
    for(int i=1; i<=n;i++){
        int x;
        printf ("NHAP DATA CUA NODE %d: ",i);
        scanf("%d",&x);
        //tao node p co data = x
        Node* p = CreateNode(x);
        //them node p co data x vao trong cay
        InsertNode(root, p);
    }
}

Chú ý: Hàm CreateNode(x) đã được nêu ở bài trước. Hàm này có chức năng tạo ra một node của cây trước khi đưa vào hàm InsertNode(root,p)

Ở trên mới ta mới chỉ có hàm nhập cây, tuy nhiên sau khi nhập ta cần phải hiển thị dữ liệu đó ra, tôi sẽ cung cấp cho các bạn một hàm duyệt cây để các có thể chạy thử nghiệm kết quả:

void NLR(Tree root){
    if (root!=NULL){
        //hien thi du lieu cua tung node sau khi duyet
        printf(root->data);
        //su dung de quy de duyet tiep cay con trai
        NLR(root->left);
        //su dung de quy de duyet tiep cay con phai
        NLR("%d \t",root->right);
    }
}

Ngoài hàm duyệt cây ở trên, còn thêm một số hàm duyệt cây theo từng cách khác, chi tiết về các hàm duyệt cây sẽ được đề cập ở bài sau, ở bài này bạn hãy coppy chúng và đưa vào trương trình nếu muốn hiển thị được dữ liệu sau khi nhập vào cây!

3.Chương trình thêm phần tử vào trong cây nhị phân

Để hiểu rõ hơn về việc thêm phần tử vào cây nhị phân, mời bạn đọc cùng tham khảo đoạn code hoàn chỉnh dưới đây!

#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
    //khai bao du lieu cua node co kieu du lieu int
    int data;
    //khai bao con tro den cay con trai
    Node* left;
    //khai bao con tro den cay con phai
    Node* right;

};
typedef struct Node* Tree;
Tree root;

void Init (Tree &root){   
    //gan node goc ve NULL
    root = NULL;
}

Node* CreateNode (int x){
    //tao node moi
    Node* p = new Node;
    //neu node p duoc cap phat bo nho
    if (p != NULL){
        //gan cay con trai va cay con phai mac dinh bang NULL
        p->left = NULL;
        p->right = NULL;
        //gan data bang x
        p->data = x;
    }
    //tra ve node p
    return p;
}
int InsertNode(Tree &root, Node*p){
    //neu node root khac rong thi thuc hien them vao cay
    if (root != NULL){
        //neu 2 data cua 2 node bang nhau thi ket thuc
        if (root->data==p->data){
            return 0;
        }
        //neu khoa cua root lon hon khoa cua p thi goi de quy trai 
        if (root->data > p->data){
            return InsertNode(root->left, p);
        }
        else{//neu khoa cua root nho hon khoa cua p thi goi de quy phai 
            return InsertNode(root->right,p);
        }
    }else { //truong hop neu node root la rong thi them node p vao node root
        root = p;
    }
}

void Input(Tree &root){
    int n;
    printf ("NHAP SO LUONG NODE CAN THEM: "); 
    scanf("%d",&n);
    for(int i=1; i<=n;i++){
        int x;
        printf ("NHAP DATA CUA NODE %d: ",i); 
        scanf("%d",&x);
        //tao node p co data = x
        Node* p = CreateNode(x);
        //them node p co data x vao trong cay
        InsertNode(root, p);
    }
}

void NLR(Tree root){
    if (root!=NULL){
        //hien thi du lieu cua tung node sau khi duyet
        printf("%d \t",root->data);
        //su dung de quy de duyet tiep cay con trai
        NLR(root->left);
        //su dung de quy de duyet tiep cay con phai
        NLR(root->right);
    }
}

int main(){
    //tao cay voi node goc la root
    Tree root;
    //khoi tao cay
    Init(root);
    //nhap n phan tu vao cay
    Input(root);
    //them mot phan tu moi vao trong cay
    int x = 15;
    Node *p = CreateNode(x);
    InsertNode(root,p);
    //hien thi tat ca du lieu vua them vao cay
    NLR(root);
}

Chương trình dưới đây chỉ dừng lại ở việc cài đặt hoàn chỉnh thao tác thêm phần tử vào trong cây nhị phân tìm kiếm. Chương trình khi được thực thi vẫn chưa hiển thị ra được kết quả nào vì ta chưa có hàm duyệt cây. Trong bài sau ta sẽ đi tìm hiểu về các phương pháp duyệt cây và đi xây dựng những hàm duyệt cây. Mời bạn đọc cùng đón xem!