4、重建二叉树 (给出前序中序,重建二叉树) 好题 绝对的好题
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
示例1
输入
[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]
返回值
{1,2,5,3,4,6,7}
1、力扣上的一种解法
需要首先熟悉二叉树先序遍历与中序遍历的规则。
先找到preorder中的起始元素作为根节点,在inorder中找到根节点的索引mid;那么pre[1:mid] 为左子树,pre[mid+1:] 为右子树。 inorder[0:mid-1] 为左子树,inorder[mid+1:] 为右子树,然后递归建立二叉树。
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { if (pre.size() == 0 || vin.size() == 0) { return NULL; } TreeNode* treeNode = new TreeNode(pre[0]); int mid = distance(begin(vin), find(vin.begin(), vin.end(), pre[0])); vector<int> left_pre(pre.begin() + 1, pre.begin() + mid + 1); vector<int> right_pre(pre.begin() + mid + 1, pre.end()); vector<int> left_in(vin.begin(), vin.begin() + mid); vector<int> right_in(vin.begin() + mid + 1, vin.end()); treeNode->left = reConstructBinaryTree(left_pre, left_in); treeNode->right = reConstructBinaryTree(right_pre, right_in); return treeNode; }
五分钟学算法公众号解析:https://mp.weixin.qq.com/s/QHt9fGP-q8RAs8GI7fP3hw
2、借助哈希来进行加速的一种做法
TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin) { unordered_map<int, int> unmp; for (int