本题给出了二叉树的前序遍历和中序遍历。
- 前序遍历:根 左 右
- 中序遍历:左 根 右
前序遍历第一个节点为根节点,明确了根节点可以在中序遍历中确定哪些节点为左子树节点,哪些节点为右子树节点。
例如:前序遍历序列{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); } };