剑指offer-04 重建二叉树

剑指offer-04 重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

题目类别

解题思路

递归求解,得到先序遍历和中序遍历之后,先得到跟节点,然后在找到中序遍历中根的位置。遍历中序数组,将根的左边放到新的vin_left数组中,根的右边放到新的vin_right数组中,这里要跳过跟节点。在遍历中序数组的时候,将pre_i置为1,遍历前序数组,此处已经跳过跟节点,根左边放到新的pre_left数组中,根的右边放到新的pre_right数组中,然后在分别递归出左子树和右子树。

具体实现

//Definition for binary tree
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
public:
 TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
      if(pre.size() == 0 || vin.size() == 0 || pre.size() != vin.size())
          return nullptr;
      int rootVal = pre[0];
      TreeNode *root = new TreeNode(rootVal);
      vector<int> pre_left,vin_left,pre_right,vin_right;
      int i = 0;
      while(vin[i] != rootVal){
          i++;
      }
      int pre_i = 1;
      for(int j = 0; j < vin.size(); j++ ){
          if(j < i ){
              pre_left.push_back(pre[pre_i]);
              vin_left.push_back(vin[j]);
              pre_i++;
          }
          if(j > i){
              pre_right.push_back(pre[pre_i]);
              vin_right.push_back(vin[j]);
              pre_i++;
          }
      }
      root->left = reConstructBinaryTree(pre_left,vin_left);
      root->right = reConstructBinaryTree(pre_right,vin_right);
      return root;
  }
};
发布了38 篇原创文章 · 获赞 6 · 访问量 8560

猜你喜欢

转载自blog.csdn.net/qq_36400206/article/details/104187085
今日推荐