求根结点到x结点的路径(假定结点不重复)。 输入样例: 输入一行字符序列先序递归构建二叉树。每个字符对应一个结点,#表示空结点。第二行输入一个结点值x。 52#3##41##6## 3 输出样例: 输出从根到结点x的路径。 5 2 3 用C语言完成
时间: 2024-03-25 13:38:05 浏览: 88
建立二叉树并求指定结点路径
好的,下面是使用 C 语言实现该问题的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
// 二叉树结点的定义
typedef struct TreeNode {
int val; // 结点值
struct TreeNode* left; // 左子树
struct TreeNode* right; // 右子树
} TreeNode;
// 构建二叉树
TreeNode* buildTree(char* preorder, int* i) {
if (*i >= strlen(preorder)) {
return NULL;
}
if (preorder[*i] == '#') {
(*i)++;
return NULL;
}
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = preorder[(*i)++] - '0';
root->left = buildTree(preorder, i);
root->right = buildTree(preorder, i);
return root;
}
// 查找从根结点到目标结点的路径
int findPath(TreeNode* root, int x, int* path, int* pathLen) {
if (!root) {
return 0;
}
path[(*pathLen)++] = root->val;
if (root->val == x) {
return 1;
}
if (findPath(root->left, x, path, pathLen) || findPath(root->right, x, path, pathLen)) {
return 1;
}
(*pathLen)--;
return 0;
}
int main() {
char preorder[MAX_SIZE];
fgets(preorder, MAX_SIZE, stdin);
int x;
scanf("%d", &x);
// 构建二叉树
int i = 0;
TreeNode* root = buildTree(preorder, &i);
// 查找从根结点到目标结点的路径
int path[MAX_SIZE], pathLen = 0;
findPath(root, x, path, &pathLen);
// 输出路径
for (int i = 0; i < pathLen; i++) {
printf("%d ", path[i]);
}
printf("\n");
return 0;
}
```
在 C 语言中,我们可以使用结构体定义二叉树的结点,具体实现中,我们定义了 `TreeNode` 结构体,并在其中包含了结点的值 `val`,左子树 `left` 和右子树 `right`。在构建二叉树时,我们使用先序递归的方式,如果当前字符为 `#` 则表示当前结点为空,否则就创建新的结点,并递归构建其左右子树。
在查找从根结点到目标结点的路径时,我们同样使用了递归的方式。具体实现中,我们使用一个 `path` 数组来保存路径,`pathLen` 变量表示当前路径中结点的个数。在递归查找目标结点时,如果找到了目标结点,则返回 `1`,否则就在左右子树中递归查找。如果最终找到了目标结点,则不断将路径上的结点添加到 `path` 数组中,并在最终返回时输出路径即可。
注意,由于 C 语言中无法返回数组,因此我们需要使用指针来传递数组,并在函数的参数中传递数组的长度。
阅读全文