剑指 Offer 07. 重建二叉树+递归+图解+易于理解

剑指 Offer 07. 重建二叉树

题干:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

分析:
剑指 Offer 07. 重建二叉树+递归+图解+易于理解_第1张图片

class Solution {

public:



  // 3、递归

  TreeNode *helper(vector& preorder, int pre_start, int pre_end, vector& inorder, int in_start, int in_end)

  {

​    // 递归出口(因为前序和中序类似,故只用一个判断即可)

​    if (pre_start > pre_end) return NULL;

​    // 递归操作:建节点,算参数

​    TreeNode *root = new TreeNode(preorder[pre_start]);

​    if (pre_start == pre_end ) return root;



​    int root_inindex = hm[preorder[pre_start]];



​    int left_nodes = root_inindex - in_start;

​    int right_nodes = in_end - root_inindex;



​    root->left = helper(preorder, pre_start + 1, pre_start + left_nodes, inorder, in_start, root_inindex - 1);

​    //root->right = helper(preorder, pre_start + left_nodes + 1, pre_end, inorder, root_inindex+1, in_end); //每次递归都会减少,不能直接prestart相加。

​    root->right = helper(preorder, pre_end - right_nodes + 1, pre_end, inorder, root_inindex + 1, in_end);

​    return root;

  }

  TreeNode* buildTree(vector& preorder, vector& inorder) {

​    if (preorder.size() == 0) return NULL;

​    // 1、将数组移到map中

​    for (int i = 0; i < inorder.size(); i++)

​    {

​      hm[inorder[i]] = i;

​    }

  



​    // 2、准备递归

​    return helper(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);

  }

private:  

  unordered_map hm;



};

你可能感兴趣的:(c++,数据结构,树,二叉树,算法,c++,数据结构)