105. 从前序与中序遍历序列构造二叉树

leetcode-105. 从前序与中序遍历序列构造二叉树

想起一道经典的408题,层序遍历、前序遍历、中序遍历、后序遍历四种遍历方法两两组合,哪个组合不能确定一个二叉树?

答案显然是前序遍历和后序遍历组合。

这里要实现的就是,从前序与中序遍历序列构造二叉树。

方法很简单:把遍历分成左子树、根和右子树,再分别把左右子树递归。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
TreeNode* node = new TreeNode(preorder[0]);
if(preorder.size() == 1)
return node;
int left = find(inorder.begin(),inorder.end(),preorder[0]) - inorder.begin();
if(left != 0)
{
vector<int> pre(preorder.begin() + 1, preorder.begin() + 1 + left);
vector<int> ino(inorder.begin(),inorder.begin() + left);
node->left = buildTree(pre, ino);
}
if(left + 1 != preorder.size())
{
vector<int> pre(preorder.begin() + 1 + left, preorder.end());
vector<int> ino(inorder.begin() + left + 1, inorder.end());
node->right = buildTree(pre, ino);
}
return node;
}
};