题目
Given preorder and inorder traversal of a tree, construct the binary tree
翻译
根据前序遍历和中序遍历重建二叉树
分析
将之前在数据结构上所学的通过前序和中序写出二叉树融入进来
1.确定根节点,然后以根节点来进行递归,前序遍历的根节点为第一个。
2.求解树的子树,中序遍历中根左边为左子树,右边为右子树
3.递归求解
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x):val(x),left(nullptr),right(nullptr){}
};
class Solution {
public:
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
int size = preorder.size();
if(size <= 0){
return nullptr;
}//if
return PreInBuildTree(preorder,inorder,0,0,size);
}
private:
TreeNode* PreInBuildTree(vector<int> &preorder,vector<int> &inorder,int preIndex,int inIndex,int size){
if(size <= 0){
return nullptr;
}//if
// 根节点
TreeNode* root = new TreeNode(preorder[preIndex]);
// 寻找根节点在中序遍历数组的下标
int index = 0;
for(int i = 0;i < size;++i){
if(preorder[preIndex] == inorder[inIndex+i]){
index = inIndex+i;
break;
}//if
}//for
// 左子树个数
int leftSize = index - inIndex;
// 右子树个数
int rightSize = size - leftSize - 1;
// 左子树
root->left = PreInBuildTree(preorder,inorder,preIndex+1,inIndex,leftSize);
// 右子树
root->right = PreInBuildTree(preorder,inorder,preIndex+1+leftSize,index+1,rightSize);
return root;
}
};