用C语言,给出N(N<1000)个整数,用它们构建一个二叉排序树。请计算以元素K为根的子树节点个数。 输入说明: 第一行输入N和K,第二行输入N个整数。 输出说明:以元素K为根的子树节点个数 输入样例:7 11 12 15 11 8 6 10 3 输出样例:5
时间: 2024-10-26 17:03:20 浏览: 131
在C语言中,要实现这个功能,你需要先创建一个二叉搜索树(BST)结构,并通过插入函数将给定的整数顺序地放入树中。然后,对于每个元素K,你需要遍历整个树来找出以它为根的所有子树的节点数。
首先,我们可以定义一个简单的二叉搜索树结构:
```c
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
```
接下来,我们需要实现插入节点、查找节点以及计算以某个节点为根的子树节点总数的功能。这里是一个简化的示例:
```c
int insert(struct TreeNode** root, int val) {
if (*root == NULL) {
*root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
(*root)->val = val;
(*root)->left = NULL;
(*root)->right = NULL;
} else if (val < (*root)->val) {
(*root)->left = insert(&(*root)->left, val);
} else {
(*root)->right = insert(&(*root)->right, val);
}
return (*root);
}
int countSubtreeNodes(struct TreeNode* node, int k) {
if (node == NULL) {
return 0;
}
if (node->val == k) {
// 如果当前节点就是目标值,递归计算左子树和右子树节点数并加1
return countSubtreeNodes(node->left, k) + countSubtreeNodes(node->right, k) + 1;
} else if (node->val < k) {
// 否则如果小于目标值,继续在右子树递归
return countSubtreeNodes(node->right, k);
} else {
// 同理,在左子树递归
return countSubtreeNodes(node->left, k);
}
}
int main() {
int n, k;
scanf("%d %d", &n, &k);
struct TreeNode* root = NULL;
for (int i = 0; i < n; i++) {
int num;
scanf("%d", &num);
root = insert(&root, num);
}
int result = countSubtreeNodes(root, k);
printf("以元素K为根的子树节点个数: %d\n", result);
return 0;
}
```
输入样例:`7 11 12 15 11 8 6 10 3`
输出样例:`5`
阅读全文