1.二叉查找树的定义
对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值。
2.主要实现插入,删除等操作,代码如下:
//
// SerachTree.h
// SearchTree
//
// Created by Mac on 15/11/24.
// Copyright © 2015年 Mac. All rights reserved.
//
#ifndef SerachTree_h
#define SerachTree_h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _tagST{
int data;
struct _tagST* left;
struct _tagST* right;
}SerachTree;
//create a tree with nothing
SerachTree* STCreate();
//insert
SerachTree* STInsert(SerachTree* t,int data);
//delete
SerachTree* STDelete(SerachTree* t,int data);
//find data
SerachTree* STFind(SerachTree* t,int data);
//find min data
SerachTree* STFindMin(SerachTree* t);
//find max data
SerachTree* STFindMax(SerachTree* t);
//destroy a tree
void STDestroy(SerachTree* t);
#endif /* SerachTree_h */
//
// SerachTree.c
// SearchTree
//
// Created by Mac on 15/11/24.
// Copyright © 2015年 Mac. All rights reserved.
//
#include "SerachTree.h"
static SerachTree* MakeEmpty(SerachTree* t){
if (t != NULL) {
MakeEmpty(t->left);
MakeEmpty(t->right);
free(t);
t = NULL;
}
return NULL;
}
//create a tree with nothing
SerachTree* STCreate(){
return NULL;
}
//insert
SerachTree* STInsert(SerachTree* t,int data){
if (t == NULL) {
t = (SerachTree*)malloc(sizeof(SerachTree));
if (t == NULL) {
return NULL;
}
t->data = data;
t->left = t->right = NULL;
}
else if (data < t->data){
t->left = STInsert(t->left, data);
}
else if (data > t->data){
t->right = STInsert(t->right, data);
}
return t;
}
//del data
SerachTree* STDelete(SerachTree* t,int data){
if (t == NULL) {
return NULL;
}
SerachTree* tmp = NULL;
if (data < t->data) {
t->left = STDelete(t->left, data);
}
else if (data > t->data){
t->right = STDelete(t->right, data);
}
else{
if (t->left && t->right) { //hava two children
//find min data in right child replace this node
tmp = STFindMin(t);
t->data = tmp->data;
t->right = STDelete(t->right, data); //delete node in right child
}
else{ //hava one or zero child
tmp = t;
if (t->left == NULL) {
t = t->right;
}
else if (t->right == NULL){
t = t->left;
}
free(tmp);
tmp = NULL;
}
}
return t;
}
//find data
SerachTree* STFind(SerachTree* t,int data){
if (t == NULL) {
return NULL;
}
if (data < t->data) {
return STFind(t->left, data);
}
else if (data > t->data){
return STFind(t->right, data);
}
else{
return t;
}
}
//find min data
SerachTree* STFindMin(SerachTree* t){
if (t == NULL) {
return NULL;
}
if (t->left == NULL) {
return t;
}
else{
return STFindMin(t->left);
}
}
//find max data
SerachTree* STFindMax(SerachTree* t){
if (t == NULL) {
return NULL;
}
SerachTree* tmp = t;
while (tmp->right != NULL) {
tmp = tmp->right;
}
return tmp;
}
//destroy a tree
void STDestroy(SerachTree* t){
MakeEmpty(t);
}
//
// main.c
// SearchTree
//
// Created by Mac on 15/11/24.
// Copyright © 2015年 Mac. All rights reserved.
//
#include <stdio.h>
#include "SerachTree.h"
int main(int argc, const char * argv[]) {
// insert code here...
SerachTree * t = STCreate();
for (int i = 0; i < 100; i++) {
t = STInsert(t, i+1);
}
fprintf(stderr, "dd %d\n",t->data);
SerachTree* f = STFind(t, 26);
if (f == NULL) {
fprintf(stderr, "没有找到结点\n");
return -1;
}
fprintf(stderr, "%d\n",f->data);
// fprintf(stderr, "%d\n",f->left->data);
fprintf(stderr, "%d\n",f->right->data);
t = STDelete(t, 100);
t = STDelete(t, 0);
t = STDelete(t, 3);
SerachTree* minNode = STFindMin(t);
if (minNode == NULL) {
return -2;
}
fprintf(stderr, "min node = %d\n",minNode->data);
SerachTree* maxNode = STFindMax(t);
if (maxNode == NULL) {
return -2;
}
fprintf(stderr, "max node = %d\n",maxNode->data);
STDestroy(t);
return 0;
}