算法——层序遍历和中序遍历构造二叉树

[复制链接]
发表于 2025-3-17 04:05:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
晴问
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <unordered_map>
  5. using namespace std;
  6. struct TreeNode {
  7.     int data;
  8.     TreeNode *left;
  9.     TreeNode *right;
  10.     TreeNode(int data) : data(data), left(nullptr), right(nullptr) {}
  11. };
  12. // 函数用于根据层序和中序遍历结果重建二叉树
  13. TreeNode* buildTree(vector<int>& levelOrder, vector<int>& inOrder, int inStart, int inEnd, int levelStart, int levelEnd) {
  14.     if (inStart > inEnd) return nullptr;
  15.     TreeNode* root = new TreeNode(levelOrder[levelStart]);
  16.     int inRootIndex = inStart;
  17.     while (inOrder[inRootIndex] != levelOrder[levelStart]) {
  18.         inRootIndex++;
  19.     }
  20.     int leftTreeSize = inRootIndex - inStart;
  21.     root->left = buildTree(levelOrder, inOrder, inStart, inRootIndex - 1, levelStart + 1, levelStart + leftTreeSize);
  22.     root->right = buildTree(levelOrder, inOrder, inRootIndex + 1, inEnd, levelStart + leftTreeSize + 1, levelEnd);
  23.     return root;
  24. }
  25. // 先序遍历函数
  26. void preOrder(TreeNode* root) {
  27.     if (root == nullptr) return;
  28.     cout << root->data << " ";
  29.     preOrder(root->left);
  30.     preOrder(root->right);
  31. }
  32. int main() {
  33.     int n;
  34.     cin >> n;
  35.     vector<int> levelOrder(n), inOrder(n);
  36.     for (int i = 0; i < n; ++i) {
  37.         cin >> levelOrder[i];
  38.     }
  39.     for (int i = 0; i < n; ++i) {
  40.         cin >> inOrder[i];
  41.     }
  42.     TreeNode* root = buildTree(levelOrder, inOrder, 0, n - 1, 0, n - 1);
  43.     preOrder(root);
  44.     return 0;
  45. }
复制代码

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表