欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-17 16:55:15
...

剑指 Offer 07. 重建二叉树

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

例如,给出

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

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

class Solution {

public:



  // 3、递归

  TreeNode *helper(vector<int>& preorder, int pre_start, int pre_end, vector<int>& 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<int>& preorder, vector<int>& 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<int, int> hm;



};