题目描述
解题思路
- 前序遍历:先访问根节点,再访问左子树,再访问右子树。
- 后序遍历:先访问左子树,再访问右子树,再访问根节点。
- 中序遍历:先访问左子树,再访问根节点,再访问右子树。
- 规律
1)前序遍历序列的第一个节点是根
2)后序遍历序列的最后一个节点是根
3)中序遍历中,根左边的是左子树部分,跟右边的右子树部分
4)前序(后序)遍历决定层次,中序遍历决定顺序。 - 思路
设计到树的问题,首先考虑递归。
寻找前序遍历序列中首节点(即根节点)在中序遍历序列中的位置,判断出左子树和右子树包含的节点,则建立起了树的顶层。随后递归地建立左子树和右子树即可。
代码
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return buildTree(preorder.begin(), preorder.end(), inorder.begin(), inorder.end());
}
TreeNode* buildTree(vector<int>::iterator preBegin,
vector<int>::iterator preEnd,
vector<int>::iterator inBegin,
vector<int>::iterator inEnd)
{
if(preBegin == preEnd)
{
return NULL;
}
TreeNode* cur = new TreeNode(*preBegin);
vector<int>::iterator posi= find(inBegin, inEnd,*preBegin);
cur->left = buildTree(preBegin+1, preBegin+(posi-inBegin)+1, inBegin, posi);
cur->right = buildTree(preBegin+(posi-inBegin)+1, preEnd, posi+1, inEnd);
return cur;
}
};