剑指 Offer 07. 重建二叉树+递归+图解+易于理解
程序员文章站
2022-06-17 16:55:15
...
剑指 Offer 07. 重建二叉树
题干:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
分析:
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;
};
上一篇: [剑指Offer]-对称的二叉树