鱼C论坛

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

[已解决]非递归的中序遍历

[复制链接]
发表于 2024-11-29 16:44:20 | 显示全部楼层 |阅读模式

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

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

x
非递归的中序遍历
【问题描述】

给定二叉树,返回它的中序遍历。

要求:使用栈实现,不可使用递归。

【输入形式】

一行,包含用空格分开的n个元素,每个元素为整数或者None(None表示空结点),依次表示按自顶向下层次遍历的二叉树结点。空结点对应的“孩子”(实际上不存在)不再用None表示。

【输出形式】

一行,二叉树的中序遍历,每个值间用空格隔开。

【样例输入】

1 2 3 4 5 6
【样例输出】

4 2 5 1 6 3
【问题描述】

给定二叉树,返回它的中序遍历。

要求:使用栈实现,不可使用递归。

【输入形式】

一行,包含用空格分开的n个元素,每个元素为整数或者None(None表示空结点),依次表示按自顶向下层次遍历的二叉树结点。空结点对应的“孩子”(实际上不存在)不再用None表示。

【输出形式】

一行,二叉树的中序遍历,每个值间用空格隔开。

【样例输入】

1 2 3 4 5 6
【样例输出】

4 2 5 1 6 3

这题用C或者C++怎么做
最佳答案
2024-11-29 16:45:29
给定的二叉树使用层次遍历的顺序输入,你需要构造二叉树并实现非递归的中序遍历。以下是使用C语言的方法:

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

  3. // 定义二叉树结点结构
  4. typedef struct TreeNode {
  5.     int val;
  6.     struct TreeNode* left;
  7.     struct TreeNode* right;
  8. } TreeNode;

  9. // 栈节点
  10. typedef struct StackNode {
  11.     TreeNode* treeNode;
  12.     struct StackNode* next;
  13. } StackNode;

  14. // 入栈
  15. void push(StackNode** stack, TreeNode* treeNode) {
  16.     StackNode* new_node = (StackNode*)malloc(sizeof(StackNode));
  17.     new_node->treeNode = treeNode;
  18.     new_node->next = *stack;
  19.     *stack = new_node;
  20. }

  21. // 出栈
  22. TreeNode* pop(StackNode** stack) {
  23.     if (*stack == NULL) {
  24.         return NULL;
  25.     }
  26.     StackNode* temp = *stack;
  27.     *stack = (*stack)->next;
  28.     TreeNode* treeNode = temp->treeNode;
  29.     free(temp);
  30.     return treeNode;
  31. }

  32. // 检查栈是否为空
  33. int isEmpty(StackNode* stack) {
  34.     return stack == NULL;
  35. }

  36. // 新建树节点
  37. TreeNode* newTreeNode(int value) {
  38.     TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
  39.     node->val = value;
  40.     node->left = node->right = NULL;
  41.     return node;
  42. }

  43. // 构造二叉树函数,使用队列
  44. TreeNode* buildTree(int arr[], int n) {
  45.     if (n <= 0) return NULL;
  46.    
  47.     TreeNode** nodes = (TreeNode**)malloc(sizeof(TreeNode*) * n);
  48.     for (int i = 0; i < n; i++) {
  49.         nodes[i] = (arr[i] != -1) ? newTreeNode(arr[i]) : NULL;
  50.     }

  51.     int j = 1;
  52.     for (int i = 0; i < n && j < n; i++) {
  53.         if (nodes[i] != NULL) {
  54.             if (j < n) nodes[i]->left = nodes[j++];
  55.             if (j < n) nodes[i]->right = nodes[j++];
  56.         }
  57.     }

  58.     TreeNode* root = nodes[0];
  59.     free(nodes);
  60.     return root;
  61. }

  62. // 中序遍历非递归实现
  63. void inorderTraversal(TreeNode* root) {
  64.     StackNode* stack = NULL;
  65.     TreeNode* curr = root;
  66.     while (curr != NULL || !isEmpty(stack)) {
  67.         // 向左遍历并入栈
  68.         while (curr != NULL) {
  69.             push(&stack, curr);
  70.             curr = curr->left;
  71.         }
  72.         
  73.         // 出栈并访问
  74.         curr = pop(&stack);
  75.         printf("%d ", curr->val);
  76.         
  77.         // 访问右子树
  78.         curr = curr->right;
  79.     }
  80. }

  81. // 主函数
  82. int main() {
  83.     int arr[] = {1, 2, 3, 4, 5, 6};
  84.     int n = sizeof(arr)/sizeof(arr[0]);

  85.     TreeNode* root = buildTree(arr, n);
  86.     inorderTraversal(root);
  87.     printf("\n");

  88.     return 0;
  89. }
复制代码


注意:
- 树节点使用`-1`表示`None`,表示输入时不存在的节点。
- 实现了一个简单的堆栈来协助中序遍历。
- `buildTree`函数构建二叉树时,假设输入按层次顺序。
- 中序遍历依次访问左子树、根节点、右子树的顺序。

以上代码中使用了简单的堆栈结构实现对树的非递归中序遍历。请确保输入按照树的层次顺序,否则构建的二叉树可能不符合预期。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-11-29 16:45:29 | 显示全部楼层    本楼为最佳答案   
给定的二叉树使用层次遍历的顺序输入,你需要构造二叉树并实现非递归的中序遍历。以下是使用C语言的方法:

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

  3. // 定义二叉树结点结构
  4. typedef struct TreeNode {
  5.     int val;
  6.     struct TreeNode* left;
  7.     struct TreeNode* right;
  8. } TreeNode;

  9. // 栈节点
  10. typedef struct StackNode {
  11.     TreeNode* treeNode;
  12.     struct StackNode* next;
  13. } StackNode;

  14. // 入栈
  15. void push(StackNode** stack, TreeNode* treeNode) {
  16.     StackNode* new_node = (StackNode*)malloc(sizeof(StackNode));
  17.     new_node->treeNode = treeNode;
  18.     new_node->next = *stack;
  19.     *stack = new_node;
  20. }

  21. // 出栈
  22. TreeNode* pop(StackNode** stack) {
  23.     if (*stack == NULL) {
  24.         return NULL;
  25.     }
  26.     StackNode* temp = *stack;
  27.     *stack = (*stack)->next;
  28.     TreeNode* treeNode = temp->treeNode;
  29.     free(temp);
  30.     return treeNode;
  31. }

  32. // 检查栈是否为空
  33. int isEmpty(StackNode* stack) {
  34.     return stack == NULL;
  35. }

  36. // 新建树节点
  37. TreeNode* newTreeNode(int value) {
  38.     TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
  39.     node->val = value;
  40.     node->left = node->right = NULL;
  41.     return node;
  42. }

  43. // 构造二叉树函数,使用队列
  44. TreeNode* buildTree(int arr[], int n) {
  45.     if (n <= 0) return NULL;
  46.    
  47.     TreeNode** nodes = (TreeNode**)malloc(sizeof(TreeNode*) * n);
  48.     for (int i = 0; i < n; i++) {
  49.         nodes[i] = (arr[i] != -1) ? newTreeNode(arr[i]) : NULL;
  50.     }

  51.     int j = 1;
  52.     for (int i = 0; i < n && j < n; i++) {
  53.         if (nodes[i] != NULL) {
  54.             if (j < n) nodes[i]->left = nodes[j++];
  55.             if (j < n) nodes[i]->right = nodes[j++];
  56.         }
  57.     }

  58.     TreeNode* root = nodes[0];
  59.     free(nodes);
  60.     return root;
  61. }

  62. // 中序遍历非递归实现
  63. void inorderTraversal(TreeNode* root) {
  64.     StackNode* stack = NULL;
  65.     TreeNode* curr = root;
  66.     while (curr != NULL || !isEmpty(stack)) {
  67.         // 向左遍历并入栈
  68.         while (curr != NULL) {
  69.             push(&stack, curr);
  70.             curr = curr->left;
  71.         }
  72.         
  73.         // 出栈并访问
  74.         curr = pop(&stack);
  75.         printf("%d ", curr->val);
  76.         
  77.         // 访问右子树
  78.         curr = curr->right;
  79.     }
  80. }

  81. // 主函数
  82. int main() {
  83.     int arr[] = {1, 2, 3, 4, 5, 6};
  84.     int n = sizeof(arr)/sizeof(arr[0]);

  85.     TreeNode* root = buildTree(arr, n);
  86.     inorderTraversal(root);
  87.     printf("\n");

  88.     return 0;
  89. }
复制代码


注意:
- 树节点使用`-1`表示`None`,表示输入时不存在的节点。
- 实现了一个简单的堆栈来协助中序遍历。
- `buildTree`函数构建二叉树时,假设输入按层次顺序。
- 中序遍历依次访问左子树、根节点、右子树的顺序。

以上代码中使用了简单的堆栈结构实现对树的非递归中序遍历。请确保输入按照树的层次顺序,否则构建的二叉树可能不符合预期。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-7 07:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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