已知有—棵以二叉链表存储的二叉树,root 指向根结点,p 指向二叉树中任一结点,如何求从根结点到 p 所指结点之间的路径?用c语言编
时间: 2024-12-22 12:12:12 浏览: 14
为了在C语言中找到从根节点到给定节点p的路径,我们可以采用深度优先搜索(DFS)或者广度优先搜索(BFS)算法。这里我将给出一种基于递归的DFS方法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结构
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
struct TreeNode *parent; // 添加指向父节点的指针,用于回溯
} TreeNode;
// 回溯函数,用于从当前节点开始寻找路径
void findPath(TreeNode* root, TreeNode* p, int path[]) {
if (!root || !p) return; // 如果根节点为空或目标节点为空,则返回
if (root == p) { // 如果找到目标节点,打印路径
for (int i = 0; i < sizeof(path); i++) {
printf("%d ", path[i]);
}
printf("\n");
return;
}
// 将当前节点添加到路径数组,并继续向下查找
path[0] = root->val;
findPath(root->left, p, path + 1);
findPath(root->right, p, path + 1);
}
// 主函数
int main() {
TreeNode* root = ... // 初始化你的二叉树根节点
TreeNode* p = ... // 给定的目标节点
int path[100]; // 预先声明足够大的路径数组
int len = 0; // 记录路径长度
// 从根节点开始找起
findPath(root, p, path);
return 0;
}
```
这个示例程序首先检查根节点和目标节点是否相等,如果相等则找到了路径并打印。然后它会递归地遍历左子树和右子树,将每个访问过的节点值存入路径数组中。注意,你需要根据实际情况调整`path`数组的大小,以及处理可能不存在的路径情况。
阅读全文