m0_64279690 2022-12-29 14:19 采纳率: 33.3%
浏览 137
已结题

数据结构-构建二叉树

用先序序列和中序序列构建二叉树,采用二叉链表存储。编写递归算法,交换二叉树的左右子树,
输出新二叉树按先序遍历得到的结果。

提交格式:实现void solve(int n, int *preOrder, int *inOrder, int *outOrder)函数。
函数参数为序列长度n、先序序列preOrder、中序序列inOrder和输出序列outOrder。1<=n<=1000000,树的深度<=2000。
请不要printf输出任何内容。

输入样例1:
n=5,preOrder={1,2,3,4,5},inOrder={3,2,4,1,5}
输出样例1:
outOrder={1,5,2,4,3}

  • 写回答

8条回答 默认 最新

  • JZSJ 2022-12-30 10:34
    关注

    可以使用以下代码来实现递归交换二叉树左右子树的算法:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    struct TreeNode {
      int val;
      TreeNode *left;
      TreeNode *right;
      TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    };
    
    // 通过先序遍历和中序遍历构建二叉树
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
      if (preorder.empty()) return NULL;
    
      int root_val = preorder[0];
      TreeNode* root = new TreeNode(root_val);
    
      int k = 0;
      // 找到根节点在中序遍历中的位置
      while (inorder[k] != root_val) ++k;
    
      vector<int> left_preorder(preorder.begin() + 1, preorder.begin() + 1 + k);
      vector<int> left_inorder(inorder.begin(), inorder.begin() + k);
      root->left = buildTree(left_preorder, left_inorder);
    
      vector<int> right_preorder(preorder.begin() + 1 + k, preorder.end());
      vector<int> right_inorder(inorder.begin() + k + 1, inorder.end());
      root->right = buildTree(right_preorder, right_inorder);
    
      return root;
    }
    
    // 递归交换二叉树的左右子树
    void swapSubtrees(TreeNode* root) {
      if (root == NULL) return;
      swap(root->left, root->right);
      swapSubtrees(root->left);
      swapSubtrees(root->right);
    }
    
    // 先序遍历二叉树,将遍历结果存入数组中
    void preOrderTraverse(TreeNode* root, vector<int>& outOrder) {
      if (root == NULL) return;
      outOrder.push_back(root->val);
      preOrderTraverse(root->left, outOrder);
      preOrderTraverse(root->right, outOrder);
    }
    
    void solve(int n, int* preOrder, int* inOrder, int* outOrder) {
      // 将先序遍历和中序遍历的数组转为 vector
      vector<int> preorder(preOrder, preOrder + n);
      vector<int> inorder(inOrder, inOrder + n);
    
      // 通过先序遍历和中序遍历构建二叉树
    TreeNode* root = buildTree(preorder, inorder);
    // 递归交换二叉树的左右子树
    swapSubtrees(root);
    // 先序遍历二叉树,将遍历结果存入数组中
    vector<int> outorder;
    preOrderTraverse(root, outorder);
    
    // 将 vector 转为数组
    copy(outorder.begin(), outorder.end(), outOrder);
    }
    

    在函数 solve 中,首先将先序遍历和中序遍历的数组转为 vector,然后调用函数 buildTree 来构建二叉树。然后调用函数 swapSubtrees 来递归交换二叉树的左右子树,最后调用函数 preOrderTraverse 对二叉树进行先序遍历,将遍历结果存入数组中。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 1月7日
  • 已采纳回答 12月30日
  • 创建了问题 12月29日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装