题解 | #重构树#
重建二叉树
http://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6
树重构,第一时间想到递归,既然要用到递归,必然要确定根,左子树和右子树,可以根据给定的前序遍历和中序遍历序列获得。
这里注意两点:1、每次递归若都用一个vector的话,空间消耗大,改为传递子数组的上下界;2、子数组上下界确定,依赖于根节点确定,千万不能根据根节点的下标确定上下界,可以根据根节点下标推算,子数组元素个数。
class Solution { public: TreeNode* easyConstruct(vector<int> pre, int pre_left, int pre_right,vector<int> vin,int vin_left,int vin_right){ TreeNode* head = new TreeNode(pre[pre_left]); int l = pre.size(); int gen; if(pre_left > pre_right) return NULL; for(int i=vin_left;i<vin_right;i++){ if(vin[i] == pre[pre_left]){ gen = i; break; } } head->left = easyConstruct(pre, pre_left+1, pre_left+gen-vin_left, vin, vin_left, gen-1); head->right = easyConstruct(pre, pre_left+gen-vin_left+1, pre_right, vin, gen+1, vin_right); return head; } TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { if(pre.size() == 0) return NULL; int l = pre.size(); return easyConstruct(pre, 0 , l-1, vin, 0 , l-1); } };