本题给出了二叉树的前序遍历和中序遍历。
- 前序遍历:根 左 右
- 中序遍历:左 根 右
前序遍历第一个节点为根节点,明确了根节点可以在中序遍历中确定哪些节点为左子树节点,哪些节点为右子树节点。
例如:前序遍历序列{1,2,4,7,3,5,6,8}
中序遍历序列{4,7,2,1,5,3,8,6}
由前序遍历序列可知,1 为二叉树的根节点,根据中序遍历可知,4,7,2为左子树节点,5,3,8,6为右子树节点。然后再递归构建左子树和右子树。
代码如下:
class Solution {
public:
TreeNode* rebuild(vector<int>& pre,int pre_left,int pre_right, vector<int>& vin,int vin_left,int vin_right){
if(pre_left > pre_right || vin_left>vin_right) return nullptr;
TreeNode *root = new TreeNode(pre[pre_left]);
for(int i=vin_left; i<=vin_right; i++){
if(root->val==vin[i]){
root->left = rebuild(pre,pre_left+1,i-vin_left+pre_left,vin,vin_left,i-1);
root->right = rebuild(pre,pre_left+i-vin_left+1,pre_right,vin,i+1,vin_right);
break;
}
}
return root;
}
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
return rebuild(pre,0,pre.size()-1,vin,0,vin.size()-1);
}
}; 
京公网安备 11010502036488号