데이터 구조 - 이진 검색 트리 BST

이진 검색 트리의 정의

  • 또한 이진 트리 정렬, 이진 검색 나무, 이진 정렬 트리로 알려진 이진 트리의 특별한 종류이다.
  1. 다음과 같이 재귀 적 정의 :
  2. 어느 이진 검색 트리 빈 나무입니다
  3. 어느 왼쪽과 오른쪽 서브 트리의 서브 트리 이진 검색 트리, 트리 및 모든 노드의 왼쪽 하위 데이터 필드 인 이진 검색 트리 루트, 왼쪽 하위 트리 오른쪽 서브 트리에 의해 루트보다 같거나 작은 데이터 필드는 데이터 필드는 모든 루트 노드의 오른쪽 서브 트리가 데이터 필드보다 더 크다.

기본 조작 둘째, 이진 검색 트리

작업을 찾기 1

void search(node* root, int x){
    if(root == NULL){
        printf("search failed\n");
        return;
    }
    if(x == root->data){
        printf("%d\n", root->data);
    }else if(x < root->data){
        search(root->lchild, x);
    }else{
        search(root->rchild, x);
    }
}

2. 삽입

//注意参数root要加引用&
void insert(node* &root, int x){
    if(root == NULL){
        root = newNode(x);
        return;
    }
    if(x == root->data){
        return;
    }else if(x < root->data){
        insert(root->lchild, x);
    }else{
        insert(root->rchild, x);
    }
}

이진 검색 트리 3. 설립

node* Create(int data[], int n){
    node* root = NULL;
    for(int i = 0; i < n; i++){
        insert(root, data[i]);
    }
    return root;
}

4. 이진 검색 트리 삭제

//寻找以root为根结点的树中最大权值结点
node* findMax(node* root){
    while(root->rchild != NULL){
        root = root->rchild;
    }
    return root;
}

//以寻找root为根结点的树中最小权值结点
node* findMin(node* root){
    while(root->lchild){
        root = root->lchild;
    }
    return root;
}

//删除以root为根结点的树中权值为x的结点
void deleteNode(node* &root, int x){
    if(root == NULL) return;//不存在权值为x的结点
    if(root->data == x){
        if(root->lchild == NULL && root->rchild == NULL){//叶子结点直接删除
            root = NULL;//把root地址设为NULL,父结点就引用不到它了
        }else if(root->lchild != NULL){//左子树不为空时
            node* pre = findMax(root->lchild);//找到root的前驱结点
            root->data = pre->data;//用前驱结点覆盖root
            deleteNode(root->lchild, pre->data);//在左子树中删除结点pre
        }else{//右子树不为空
            node* next = findMin(root->rchild);//找到root后继
            root->data = next->data;//用后继结点覆盖root
            deleteNode(root->rchild, next->data);//在右子树中删除结点next
        }
    }else if(root->data > x){
        deleteNode(root->lchild, x);//在左子树中删除x
    }else{
        deleteNode(root->rchild, x);//在右子树中删除x
    }
}

셋째, 이진 검색 트리의 성격

  1. 순서 주사로 이진 검색 트리에서 결과를 횡단하는 주문한다

추천

출처www.cnblogs.com/tsruixi/p/12331864.html