设计递归算法将关键字序列{39,11,68,46,75,23,71,8,86,34}构造成一颗二叉排序树C语言
时间: 2024-03-02 17:53:05 浏览: 25
好的,以下是使用C语言实现的递归算法来构造二叉排序树:
```c
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
struct TreeNode* construct_bst(int* nums, int numsSize) {
if (numsSize == 0) {
return NULL;
}
int root_val = nums[0];
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val = root_val;
int left_size = 0;
while (left_size < numsSize && nums[left_size] < root_val) {
left_size++;
}
root->left = construct_bst(nums+1, left_size);
root->right = construct_bst(nums+left_size+1, numsSize-left_size-1);
return root;
}
void inorder_traversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
inorder_traversal(root->left);
printf("%d ", root->val);
inorder_traversal(root->right);
}
int main() {
int nums[] = {39, 11, 68, 46, 75, 23, 71, 8, 86, 34};
int numsSize = sizeof(nums) / sizeof(nums[0]);
struct TreeNode* root = construct_bst(nums, numsSize);
printf("Inorder Traversal of the constructed BST: ");
inorder_traversal(root);
printf("\n");
return 0;
}
```
在上面的代码中,我们定义了一个`struct TreeNode`结构体表示二叉树的节点,其中包含了节点值`val`以及左右子树指针`left`和`right`。`construct_bst`函数接受一个关键字序列以及序列长度作为参数,返回构造好的二叉排序树的根节点。在函数内部,我们首先判断序列是否为空,如果为空则返回空指针;否则,我们取序列的第一个元素作为根节点的值,并创建一个新节点作为根节点。接着,我们遍历序列的剩余部分,将小于根节点值的元素放入左子树中,大于根节点值的元素放入右子树中。最后,我们递归地调用`construct_bst`函数,对左子树和右子树分别进行构造,返回根节点即可。
为了验证我们的算法是否正确,我们在`main`函数中调用`construct_bst`函数构造二叉排序树,并对其进行中序遍历。中序遍历可以保证输出的序列是有序的,如果输出结果是有序的,则说明我们的算法是正确的。