请你用C语言实现搜索二叉树BST以及对应操作:前序遍历 取最小值 取最大值 搜索节点 获取前驱节点
时间: 2023-06-07 19:09:39 浏览: 147
好的,我可以为您实现搜索二叉树(BST)以及相关的操作。
首先,让我们定义一个BST节点的结构体:
```
typedef struct node {
int key;
struct node *left;
struct node *right;
} node_t;
```
这个结构体包括了节点的值(key)以及左右子节点的指针。现在我们可以定义一个BST的结构体,这个结构体包含了BST的根节点指针:
```
typedef struct bst {
node_t *root;
} bst_t;
```
现在,我们可以实现以下操作:
1. 创建一个新的节点
```
node_t *new_node(int key) {
node_t *node = (node_t *) malloc(sizeof(node_t));
node->key = key;
node->left = NULL;
node->right = NULL;
return node;
}
```
2. 向BST中插入一个节点
```
void insert(bst_t *bst, int key) {
node_t *parent = NULL;
node_t *current = bst->root;
while (current != NULL) {
parent = current;
if (key < current->key) {
current = current->left;
} else {
current = current->right;
}
}
node_t *node = new_node(key);
if (parent == NULL) {
bst->root = node;
} else if (key < parent->key) {
parent->left = node;
} else {
parent->right = node;
}
}
```
3. 获取BST的最小值
```
node_t *min_value(node_t *node) {
while (node->left != NULL) {
node = node->left;
}
return node;
}
int get_min(bst_t *bst) {
return min_value(bst->root)->key;
}
```
4. 获取BST的最大值
```
node_t *max_value(node_t *node) {
while (node->right != NULL) {
node = node->right;
}
return node;
}
int get_max(bst_t *bst) {
return max_value(bst->root)->key;
}
```
5. 在BST中搜索一个节点
```
node_t *search(node_t *node, int key) {
if (node == NULL || node->key == key) {
return node;
}
if (key < node->key) {
return search(node->left, key);
}
return search(node->right, key);
}
node_t *get_node(bst_t *bst, int key) {
return search(bst->root, key);
}
```
6. 获取一个节点的前驱节点
```
node_t *predecessor(node_t *node) {
if (node == NULL) {
return NULL;
}
if (node->left != NULL) {
return max_value(node->left);
}
node_t *parent = node->parent;
while (parent != NULL && node == parent->left) {
node = parent;
parent = parent->parent;
}
return parent;
}
node_t *get_predecessor(bst_t *bst, int key) {
node_t *node = get_node(bst, key);
if (node == NULL) {
return NULL;
}
return predecessor(node);
}
```
7. 前序遍历BST
```
void preorder(node_t *node) {
if (node != NULL) {
printf("%d ", node->key);
preorder(node->left);
preorder(node->right);
}
}
void traverse_preorder(bst_t *bst) {
preorder(bst->root);
}
```
现在,我们已经成功地实现了搜索二叉树以及相关操作。
阅读全文