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
京公网安备 11010502036488号