leetcode 105. 从前序与中序遍历序列构造二叉树
递归三部曲
1.返回值和参数:输出前序和中序的 vector< int > 和起止索引 int,输出树的根节点
2.单层递归逻辑:前序和中序只有一个元素,返回,否则在中序中找到前序的首位元素,在将中序按次元素划分为两个部分,当前节点的左子树根据划分的左边部分得到,右子树根据右边部分得到
3.终止条件:当前数组为1返回当前节点,为0返回 空
class Solution {
unordered_map<int, int> inMap;
TreeNode* buildTree(vector<int>& preorder, int preBegin, int preEnd, vector<int>& inorder, int inBegin, int inEnd)
{
if(preBegin >= preEnd) return nullptr;
TreeNode* root = new TreeNode(preorder[preBegin]);
if(preEnd - preBegin == 1) return root;
int index = inMap[root->val];
int leftSize = index - inBegin;
root->left = buildTree(preorder, preBegin + 1, preBegin + leftSize + 1, inorder, inBegin, index);
root->right = buildTree(preorder, leftSize + preBegin + 1, preEnd, inorder, index + 1, inEnd);
return root;
}
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int size = preorder.size();
for(int i = 0; i < size; ++i)
inMap[inorder[i]] = i;
return buildTree(preorder, 0, size, inorder, 0, size);
}
};
leetcode 106. 从中序与后序遍历序列构造二叉树
1.返回值和参数:输出后序和中序的 vector< int > 和起止索引 int,输出树的根节点
2.单层递归逻辑:前序和中序只有一个元素,返回,否则在中序中找到后序的尾部元素,在将中序按次元素划分为两个部分,当前节点的左子树根据划分的左边部分得到,右子树根据右边部分得到
3.终止条件:当前数组为1返回当前节点,为0返回 空
class Solution {
unordered_map<int, int> inMap;
TreeNode* buildTree(vector<int>& inorder, int inBegin, int inEnd, vector<int>& postorder, int postBegin, int postEnd)
{
if(inBegin > inEnd)
return nullptr;
TreeNode* root = new TreeNode(postorder[postEnd]);
if(inBegin == inEnd)
return root;
//int index = inBegin;
//while(index <= inEnd && inorder[index] != root->val) ++index;
int index = inMap[root->val];
int leftSize = index - inBegin;
root->left = buildTree(inorder, inBegin, index - 1, postorder, postBegin, leftSize + postBegin - 1);
root->right = buildTree(inorder, index + 1, inEnd, postorder,leftSize + postBegin, postEnd - 1);
return root;
}
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int inSzie = inorder.size() - 1;
int postSize = postorder.size() - 1;
for(int i = 0; i <= inSzie; ++i)
inMap[inorder[i]] = i;
return buildTree(inorder, 0, inSzie, postorder, 0, postSize);
}
};