1,前序和中序序列构造二叉树
来源:105. 从前序与中序遍历序列构造二叉树 && 剑指 Offer 07. 重建二叉树
思路:前序序列的第一个数字即为树根节点,中序遍历中找到该数字,将中序序列一分为二,左侧数字组成左子树,右侧组成右子树。依次类推。
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return create(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
}
TreeNode* create(const vector<int>& preorder, int s1, int e1, const vector<int>& inorder, int s2, int e2) {
if (s1 > e1) return NULL;
// 在inorder中找到preorder[s1],将inorder一分为二,左侧个数:p-s2
int p = s2;
while (inorder[p] != preorder[s1]) {
p++;
}
TreeNode *ret = new TreeNode(preorder[s1]);
ret->left = create(preorder, s1+1, s1+p-s2, inorder, s2, p-1);
ret->right = create(preorder, s1+p-s2+1, e1, inorder, p+1, e2);
return ret;
}
};
2,后序和中序序列构造二叉树
思路:与题1相似。后序序列最后一个数字为根节点。
class Solution {
public:
TreeNode* buildT