鱼C论坛

 找回密码
 立即注册
查看: 1058|回复: 1

[已解决]二叉树问题

[复制链接]
发表于 2023-4-17 23:18:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
实现以下两种要求
1.设计算法以输出每个结点到根结点之间的路径上的所有结点的值。
2.设计算法将一棵以顺序存储方式存储在数组A[]中的二叉树(已转换为完全二叉树,补充的虚拟结点为值为’#’)转换为二叉链表存储形式。
最佳答案
2023-4-17 23:23:37
1、设计算法以输出每个结点到根结点之间的路径上的所有结点的值。
以下是一个C语言实现的递归算法,用于输出二叉树中每个结点到根结点之间的路径上的所有结点的值:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct TreeNode {
  4.     char val;
  5.     struct TreeNode *left;
  6.     struct TreeNode *right;
  7. } TreeNode;

  8. void printArray(char arr[], int n) {
  9.     for (int i = 0; i < n; i++) {
  10.         printf("%c -> ", arr[i]);
  11.     }
  12.     printf("根结点\n");
  13. }

  14. void printPathsRecur(TreeNode *node, char path[], int pathLen) {
  15.     if (node == NULL) {
  16.         return;
  17.     }

  18.     path[pathLen] = node->val;
  19.     pathLen++;

  20.     if (node->left == NULL && node->right == NULL) {
  21.         printArray(path, pathLen);
  22.     } else {
  23.         printPathsRecur(node->left, path, pathLen);
  24.         printPathsRecur(node->right, path, pathLen);
  25.     }
  26. }

  27. void printPaths(TreeNode *node) {
  28.     char path[1000];
  29.     int pathLen = 0;
  30.     printPathsRecur(node, path, pathLen);
  31. }

  32. int main() {
  33.     // 创建一个简单的二叉树
  34.     TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));
  35.     root->val = 'A';
  36.     root->left = (TreeNode *)malloc(sizeof(TreeNode));
  37.     root->left->val = 'B';
  38.     root->left->left = NULL;
  39.     root->left->right = NULL;
  40.     root->right = (TreeNode *)malloc(sizeof(TreeNode));
  41.     root->right->val = 'C';
  42.     root->right->left = NULL;
  43.     root->right->right = NULL;

  44.     printPaths(root);
  45.     return 0;
  46. }
复制代码


2、设计算法将一棵以顺序存储方式存储在数组A[]中的二叉树(已转换为完全二叉树,补充的虚拟结点为值为'#')转换为二叉链表存储形式。
以下是一个C语言实现的算法,用于将顺序存储的二叉树转换为链式存储的二叉树:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct TreeNode {
  4.     char val;
  5.     struct TreeNode *left;
  6.     struct TreeNode *right;
  7. } TreeNode;

  8. TreeNode *buildBinaryTree(const char A[], int index, int size) {
  9.     if (index >= size || A[index] == '#') {
  10.         return NULL;
  11.     }

  12.     TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode));
  13.     node->val = A[index];
  14.     node->left = buildBinaryTree(A, 2 * index + 1, size);
  15.     node->right = buildBinaryTree(A, 2 * index + 2, size);

  16.     return node;
  17. }

  18. void printPreOrder(TreeNode *node) {
  19.     if (node == NULL) {
  20.         return;
  21.     }

  22.     printf("%c ", node->val);
  23.     printPreOrder(node->left);
  24.     printPreOrder(node->right);
  25. }

  26. int main() {
  27.     char A[] = {'A', 'B', 'C', 'D', '#', 'E', 'F'};
  28.     int size = sizeof(A) / sizeof(char);
  29.     TreeNode *root = buildBinaryTree(A, 0, size);

  30.     printf("前序遍历链式存储的二叉树:\n");
  31.     printPreOrder(root);
  32.     printf("\n");

  33.     return 0;
  34. }
复制代码



这个代码首先实现了一个名为`buildBinaryTree`的递归函数,它根据给定的顺序存储二叉树数组和当前索引创建一个新的二叉树结点,然后递归创建左子树和右子树。当遇到虚拟结点(值为`#`)时,返回NULL。函数`printPreOrder`则用于输出链式存储二叉树的前序遍历结果。

在`main`函数中,首先创建一个顺序存储的二叉树数组`A`,然后调用`buildBinaryTree`函数将数组转换为链式存储的二叉树。最后,使用`printPreOrder`函数输出链式存储二叉树的前序遍历结果。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-4-17 23:23:37 | 显示全部楼层    本楼为最佳答案   
1、设计算法以输出每个结点到根结点之间的路径上的所有结点的值。
以下是一个C语言实现的递归算法,用于输出二叉树中每个结点到根结点之间的路径上的所有结点的值:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct TreeNode {
  4.     char val;
  5.     struct TreeNode *left;
  6.     struct TreeNode *right;
  7. } TreeNode;

  8. void printArray(char arr[], int n) {
  9.     for (int i = 0; i < n; i++) {
  10.         printf("%c -> ", arr[i]);
  11.     }
  12.     printf("根结点\n");
  13. }

  14. void printPathsRecur(TreeNode *node, char path[], int pathLen) {
  15.     if (node == NULL) {
  16.         return;
  17.     }

  18.     path[pathLen] = node->val;
  19.     pathLen++;

  20.     if (node->left == NULL && node->right == NULL) {
  21.         printArray(path, pathLen);
  22.     } else {
  23.         printPathsRecur(node->left, path, pathLen);
  24.         printPathsRecur(node->right, path, pathLen);
  25.     }
  26. }

  27. void printPaths(TreeNode *node) {
  28.     char path[1000];
  29.     int pathLen = 0;
  30.     printPathsRecur(node, path, pathLen);
  31. }

  32. int main() {
  33.     // 创建一个简单的二叉树
  34.     TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));
  35.     root->val = 'A';
  36.     root->left = (TreeNode *)malloc(sizeof(TreeNode));
  37.     root->left->val = 'B';
  38.     root->left->left = NULL;
  39.     root->left->right = NULL;
  40.     root->right = (TreeNode *)malloc(sizeof(TreeNode));
  41.     root->right->val = 'C';
  42.     root->right->left = NULL;
  43.     root->right->right = NULL;

  44.     printPaths(root);
  45.     return 0;
  46. }
复制代码


2、设计算法将一棵以顺序存储方式存储在数组A[]中的二叉树(已转换为完全二叉树,补充的虚拟结点为值为'#')转换为二叉链表存储形式。
以下是一个C语言实现的算法,用于将顺序存储的二叉树转换为链式存储的二叉树:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct TreeNode {
  4.     char val;
  5.     struct TreeNode *left;
  6.     struct TreeNode *right;
  7. } TreeNode;

  8. TreeNode *buildBinaryTree(const char A[], int index, int size) {
  9.     if (index >= size || A[index] == '#') {
  10.         return NULL;
  11.     }

  12.     TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode));
  13.     node->val = A[index];
  14.     node->left = buildBinaryTree(A, 2 * index + 1, size);
  15.     node->right = buildBinaryTree(A, 2 * index + 2, size);

  16.     return node;
  17. }

  18. void printPreOrder(TreeNode *node) {
  19.     if (node == NULL) {
  20.         return;
  21.     }

  22.     printf("%c ", node->val);
  23.     printPreOrder(node->left);
  24.     printPreOrder(node->right);
  25. }

  26. int main() {
  27.     char A[] = {'A', 'B', 'C', 'D', '#', 'E', 'F'};
  28.     int size = sizeof(A) / sizeof(char);
  29.     TreeNode *root = buildBinaryTree(A, 0, size);

  30.     printf("前序遍历链式存储的二叉树:\n");
  31.     printPreOrder(root);
  32.     printf("\n");

  33.     return 0;
  34. }
复制代码



这个代码首先实现了一个名为`buildBinaryTree`的递归函数,它根据给定的顺序存储二叉树数组和当前索引创建一个新的二叉树结点,然后递归创建左子树和右子树。当遇到虚拟结点(值为`#`)时,返回NULL。函数`printPreOrder`则用于输出链式存储二叉树的前序遍历结果。

在`main`函数中,首先创建一个顺序存储的二叉树数组`A`,然后调用`buildBinaryTree`函数将数组转换为链式存储的二叉树。最后,使用`printPreOrder`函数输出链式存储二叉树的前序遍历结果。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-9 21:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表