标签:题目 root red rest 特点 for 序列 src pre
这题就是考察两种遍历的特点,前序遍历的第一个为root结点,知道了root结点,就可以在中序遍历中知道在root结点之前的为左子树,在root结点之后的为右子树。然后就可以递归的构造出左子树和右子树。
具体实现的时候,就是要借助哈希表去在中序遍历中找root的位置。
class Solution {
private:
unordered_map<int, int> index;
public:
TreeNode* mybuildTree(const vector<int>& preorder, const vector<int>& inorder, int preStart, int preEnd,int inStart, int inEnd){
if(preStart > preEnd || inStart > inEnd) return nullptr;
// 前序遍历中的第一个节点就是根节点
TreeNode* root = new TreeNode(preorder[preStart]);
// 找到中序遍历中根节点的位置
int inRoot = index[root->val];
// 确定左子树数量
int numsleft = inRoot - inStart;
// 递归构造左子树
// 要注意的位置都是前序遍历和中序遍历中左子树的部分,所以要注意位置
root->left = mybuildTree(preorder, inorder, preStart+1, preStart+numsleft, inStart, inRoot-1);
// 递归构造右子树
// 位置注意同理左子树部分
root->right = mybuildTree(preorder, inorder, preStart+numsleft+1, preEnd, inRoot+1, inEnd);
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 mybuildTree(preorder, inorder, 0, n-1, 0, n-1);
}
};
就是要熟悉前序和中序遍历的特点,先吃饭去了。
标签:题目 root red rest 特点 for 序列 src pre
原文地址:https://www.cnblogs.com/lzyrookie/p/14643451.html