Description:
题目大意:已知先序遍历和中序遍历,构造二叉树
解题思路:
算法标签:二叉树
代码:
class Solution {
private:
map<int,int>index;
public:
TreeNode* myBuiltTree(const vector<int>& preorder,const vector<int>& inorder,int preorder_left,int preorder_right,int inorder_left,int inorder_right) {
if(preorder_left > preorder_right)
return NULL;
// 前序遍历的第一个节点就是根节点,下标
int preorder_root = preorder_left;
// 从中序遍历中定位根节点,下标
int inorder_root = index[preorder[preorder_root]];
// 先把根节点建立出来,元素
TreeNode* root = new TreeNode(preorder[preorder_root]);
// 左子树中节点的个数
int size_left = inorder_root - inorder_left;
// 递归构造左子树,并连接到根节点
// preorder 中从 preorder+1 到 preorder+size——left 对应的使 inorder 中 inorder_left 到 inorder_root-1
root -> left = myBuiltTree(preorder,inorder,preorder_left+1,preorder_left+size_left,inorder_left,inorder_root-1);
// 递归构造右子树,并连接到根节点
// preorder 中 preorder+size_left+1 到 preorder_right 对应 inorder_root+1 到inorder_right
root -> right = myBuiltTree(preorder,inorder,preorder_left+1+size_left,preorder_right,inorder_root+1,inorder_right);;
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n = preorder.size();
// 构建哈希映射,快速定位根节点
for(int i = 0;i < n;i++) {
index[inorder[i]] = i;
}
return myBuiltTree(preorder,inorder,0,n-1,0,n-1);
}
};