C语言递归实现己知一棵以二叉链表方式存储的二叉树,编写代码求先序序列中第k个结点的值
时间: 2025-01-05 20:40:10 浏览: 7
在C语言中,我们可以使用递归来遍历二叉树并找到先序序列中的第k个节点。先序遍历顺序是:根节点 -> 左子树 -> 右子树。为了实现这个功能,我们通常会创建一个辅助函数,它接受当前节点、已经访问过的节点数以及目标序号k作为参数。以下是递归函数的一个示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结构
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 辅助函数,返回第k个节点的值
int findKthNode(TreeNode* root, int k, int visited) {
if (root == NULL || visited >= k) { // 当前节点为空或已超过k,返回
return -1; // 表示未找到或已到达树的末端
}
visited++; // 访问次数加一
// 递归左子树
int result = findKthNode(root->left, k, visited);
if (result != -1) {
return result; // 如果找到了,在左子树
} else if (visited == k) { // 如果k等于当前已访问的节点数
return root->val; // 返回当前节点的值,即第k个节点
}
// 递归右子树
return findKthNode(root->right, k, visited); // 仍未找到,继续右侧
}
// 测试函数
void printPreorder(TreeNode* root, int k) {
if (root == NULL) {
printf("Empty tree or k is larger than the number of nodes.\n");
return;
}
int found = findKthNode(root, k, 0);
if (found != -1) {
printf("The value of the k-th node in preorder traversal is: %d\n", found);
} else {
printf("No such k-th node exists.\n");
}
}
int main() {
// 创建一个简单的二叉树实例
TreeNode* root = malloc(sizeof(TreeNode));
root->val = 1;
root->left = malloc(sizeof(TreeNode));
root->left->val = 2;
root->right = malloc(sizeof(TreeNode));
root->right->val = 3;
root->left->left = malloc(sizeof(TreeNode));
root->left->left->val = 4;
// ... 其他节点设置
printPreorder(root, 3); // 求先序序列中第3个节点的值
return 0;
}
```
在这个例子中,`findKthNode`函数会在递归过程中查找先序序列中的第k个节点,并在找到时返回其值。如果k大于实际节点数,函数将返回-1。
阅读全文