鱼C论坛

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

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

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

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

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

x
【问题描述】

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

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

【输入形式】

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

【输出形式】

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

【样例输入】

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

4 2 5 1 6 3

这题用C语言或者C++怎么实现
最佳答案
2024-11-29 17:13:44
下面是C++实现非递归中序遍历二叉树的示例代码,使用栈来辅助实现遍历。首先,将输入的数据构造成二叉树,然后进行中序遍历。

  1. #include <iostream>
  2. #include <sstream>
  3. #include <vector>
  4. #include <stack>
  5. #include <string>

  6. using namespace std;

  7. // 定义二叉树节点结构体
  8. struct TreeNode {
  9.     int val;
  10.     TreeNode *left;
  11.     TreeNode *right;
  12.     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  13. };

  14. // 创建二叉树
  15. TreeNode* createTree(vector<string>& nodes) {
  16.     if (nodes.empty() || nodes[0] == "None") return nullptr;
  17.     TreeNode* root = new TreeNode(stoi(nodes[0]));
  18.     vector<TreeNode*> nodeQueue = {root};
  19.     int index = 1;
  20.     // 通过字符串数组构建二叉树
  21.     for (TreeNode* node : nodeQueue) {
  22.         if (index < nodes.size() && nodes[index] != "None") {
  23.             node->left = new TreeNode(stoi(nodes[index]));
  24.             nodeQueue.push_back(node->left);
  25.         }
  26.         index++;
  27.         if (index < nodes.size() && nodes[index] != "None") {
  28.             node->right = new TreeNode(stoi(nodes[index]));
  29.             nodeQueue.push_back(node->right);
  30.         }
  31.         index++;
  32.     }
  33.     return root;
  34. }

  35. // 二叉树的非递归中序遍历
  36. vector<int> inorderTraversal(TreeNode* root) {
  37.     vector<int> result;
  38.     stack<TreeNode*> s;
  39.     TreeNode* currentNode = root;
  40.    
  41.     while (currentNode != nullptr || !s.empty()) {
  42.         // 找到最左边的节点
  43.         while (currentNode != nullptr) {
  44.             s.push(currentNode);
  45.             currentNode = currentNode->left;
  46.         }
  47.         
  48.         // 访问栈顶节点
  49.         currentNode = s.top();
  50.         s.pop();
  51.         result.push_back(currentNode->val);
  52.         
  53.         // 访问右子树
  54.         currentNode = currentNode->right;
  55.     }
  56.    
  57.     return result;
  58. }

  59. int main() {
  60.     string input;
  61.     getline(cin, input);
  62.     istringstream iss(input);
  63.     vector<string> nodes;
  64.     string node;
  65.     while (iss >> node) {
  66.         nodes.push_back(node);
  67.     }
  68.    
  69.     TreeNode* root = createTree(nodes);
  70.     vector<int> result = inorderTraversal(root);
  71.    
  72.     for (size_t i = 0; i < result.size(); ++i) {
  73.         if (i > 0) cout << " ";
  74.         cout << result[i];
  75.     }
  76.     cout << endl;
  77.    
  78.     return 0;
  79. }
复制代码


**代码说明:**
- 首先定义了一个二叉树的节点结构。
- 使用`createTree`函数根据输入创建二叉树。
- 使用`inorderTraversal`函数进行非递归中序遍历。
- 主函数中读取输入,调用以上函数,最后输出结果。

你可以根据这个思路用C实现。C++标准库中提供的`stack`类是实现非递归遍历的关键部分。

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

使用道具 举报

发表于 2024-11-29 17:13:44 | 显示全部楼层    本楼为最佳答案   
下面是C++实现非递归中序遍历二叉树的示例代码,使用栈来辅助实现遍历。首先,将输入的数据构造成二叉树,然后进行中序遍历。

  1. #include <iostream>
  2. #include <sstream>
  3. #include <vector>
  4. #include <stack>
  5. #include <string>

  6. using namespace std;

  7. // 定义二叉树节点结构体
  8. struct TreeNode {
  9.     int val;
  10.     TreeNode *left;
  11.     TreeNode *right;
  12.     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  13. };

  14. // 创建二叉树
  15. TreeNode* createTree(vector<string>& nodes) {
  16.     if (nodes.empty() || nodes[0] == "None") return nullptr;
  17.     TreeNode* root = new TreeNode(stoi(nodes[0]));
  18.     vector<TreeNode*> nodeQueue = {root};
  19.     int index = 1;
  20.     // 通过字符串数组构建二叉树
  21.     for (TreeNode* node : nodeQueue) {
  22.         if (index < nodes.size() && nodes[index] != "None") {
  23.             node->left = new TreeNode(stoi(nodes[index]));
  24.             nodeQueue.push_back(node->left);
  25.         }
  26.         index++;
  27.         if (index < nodes.size() && nodes[index] != "None") {
  28.             node->right = new TreeNode(stoi(nodes[index]));
  29.             nodeQueue.push_back(node->right);
  30.         }
  31.         index++;
  32.     }
  33.     return root;
  34. }

  35. // 二叉树的非递归中序遍历
  36. vector<int> inorderTraversal(TreeNode* root) {
  37.     vector<int> result;
  38.     stack<TreeNode*> s;
  39.     TreeNode* currentNode = root;
  40.    
  41.     while (currentNode != nullptr || !s.empty()) {
  42.         // 找到最左边的节点
  43.         while (currentNode != nullptr) {
  44.             s.push(currentNode);
  45.             currentNode = currentNode->left;
  46.         }
  47.         
  48.         // 访问栈顶节点
  49.         currentNode = s.top();
  50.         s.pop();
  51.         result.push_back(currentNode->val);
  52.         
  53.         // 访问右子树
  54.         currentNode = currentNode->right;
  55.     }
  56.    
  57.     return result;
  58. }

  59. int main() {
  60.     string input;
  61.     getline(cin, input);
  62.     istringstream iss(input);
  63.     vector<string> nodes;
  64.     string node;
  65.     while (iss >> node) {
  66.         nodes.push_back(node);
  67.     }
  68.    
  69.     TreeNode* root = createTree(nodes);
  70.     vector<int> result = inorderTraversal(root);
  71.    
  72.     for (size_t i = 0; i < result.size(); ++i) {
  73.         if (i > 0) cout << " ";
  74.         cout << result[i];
  75.     }
  76.     cout << endl;
  77.    
  78.     return 0;
  79. }
复制代码


**代码说明:**
- 首先定义了一个二叉树的节点结构。
- 使用`createTree`函数根据输入创建二叉树。
- 使用`inorderTraversal`函数进行非递归中序遍历。
- 主函数中读取输入,调用以上函数,最后输出结果。

你可以根据这个思路用C实现。C++标准库中提供的`stack`类是实现非递归遍历的关键部分。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-10 00:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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