原题
- Construct Binary Tree from Preorder and Inorder Traversal
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates(完全一样的东西)do not exist in the tree.
题意
就是给个二叉树的前序遍历和中序遍历,确定一棵树。
(数据结构中的常见题目,此处保证了每个数都不一样)
思路
这种题的大概方法是:
前序遍历的第一个节点一定为该树的根节点。
中序遍历中根节点的两边分别为左右子数。
因此我们对此不断划分,每一个化成一个又一个小子树来连接。
但是每次都遍历中序遍历来获得根节点需要耗费大量的时间。
所以此处利用哈希来减少时间复杂度。
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution
{
unordered_map<int, int> index;
public:
TreeNode *TreeTraverse(const vector<int> &preorder, const vector<int> &inorder, int pleft, int pright,int ileft,int iright)
{
if(pleft>pright){
return nullptr;
}
TreeNode *root = new TreeNode(preorder[pleft]);
int inroot = index[root->val];
root->left = TreeTraverse(preorder,inorder,pleft+1,pleft+inroot-ileft,ileft,inroot-1);
root->right = TreeTraverse(preorder,inorder,pleft+inroot-ileft+1,pright,inroot+1,iright);
return root;
}
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder)
{
for(int i=0;i<inorder.size();i++){
index[inorder[i]]=i;
}
return TreeTraverse(preorder,inorder,0,preorder.size()-1,0,inorder.size()-1);
}
};