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

打印 上一主题 下一主题

主题 1015|帖子 1015|积分 3045

晴问
  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. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

西河刘卡车医

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表