BST 삽입, 찾기, 삭제
struct node {
int key;
node *parent,*left,*right;
};
노드 와 빈 노드 를 동시에 정의 합 니 다.
node *NIL,*root;
2. 삽입 작업 진행
void Insert(int key){
node *y = NIL,*x = root,*z;
z = (node *)malloc(sizeof(node));
z->key = key;
z->left = z->right = NIL;
// , root NIL
while (x != NIL){
y = x;
if (z->key < x->key){
x = x->left;
}else
x = x->right;
}
z->parent = y;
if (y == NIL){
root = z;
}else{
if (z->key < y->key){
y->left = z;
}else
y->right = z;
}
}
3. 찾기 작업 진행
찾기 조작 은 매우 쉬 우 니, 여기 서 는 군말 하지 않 겠 다.
node *Find(node *u,int key){
while (u != NIL && u->key != key){
if (key < u->key){
u = u->left;
}else
u = u->right;
}
return u;
}
4. 삭제 작업 진행
if (p->parent == NIL && p->left == NIL){
p = p->right;root = p;return;
}else if (p->parent == NIL && p->right == NIL){
p = p->left;root = p;return;
}
그 중에서 p 는 삭제 해 야 할 노드 를 가리 키 고 q 는 p 를 가리 키 며 s 는 p 의 왼쪽 아 이 를 가리킨다.
앞의 두 가지 상황 은 비교적 간단 하 다.
세 번 째 상황 에 대해 서 는 노드 를 삭제 할 직접 전구 (또는 직접 후계) 를 찾 은 다음 에 직접 전구 (또는 직접 후계) 의 값 을 p 가 가리 키 는 노드 에 부여 한 다음 에 q 의 서브 트 리 를 다시 연결 한 다음 에 s 지침 을 free 로 떨 어 뜨리 면 됩 니 다.(그 중에서 q 는 s 를 가리 키 는 부모, 선구자 와 후계 가 모두 중간 순서 에 비해 옮 겨 다 니 는 것 입 니 다)
if (p->left == NIL){
if (p == p->parent->left){
q = p;p->parent->left = p->right;free(q);
}else{
q = p;p->parent->right = p->right;free(q);
}
}else if (p->right == NIL){
if (p == p->parent->left){
q = p;p->parent->left = p->left;free(q);
}else{
q = p;p->parent->right = p->left;free(q);
}
}else{
q = p;
s = p->left;
// p
while (s->right != NIL){
q = s;
s = s->right;
}
p->key = s->key;
if (q != p){
q->right = s->left;
}else{
q->left = s->left;
}
free(s);
}
이로써 BST 삽입, 찾기, 삭제 작업 이 완료 되 었 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.