题目:
这题其实和建立二叉树挂钩。平时有用递归建立过排序二叉树和平衡二叉树,所以理解上倒是不难。
唯一比较困难点的地方在于分割这个序列和递归传入参数的处理。
其它的就比较中规中矩。
C++代码附带测试:
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x):val(x),left(NULL),right(NULL){}
};
class Solution {
public:
unordered_map<int,int> index;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n = preorder.size();
for(int i=0;i<n;i++){
index[inorder[i]] = i;
}
return myBuildTree(preorder,inorder,0,n-1,0,n-1);
//i的位置划分左右子树
}
TreeNode* myBuildTree(vector<int>& preorder,vector<int>& inorder,int inorder_left,int inorder_right,int preorder_left,int preorder_right){
if (preorder_left > preorder_right) {
return nullptr;
}
int preorder_root = preorder_left;
int inorder_root = index[preorder[preorder_root]];//得到各自序列中的根节点
TreeNode* root = new TreeNode(preorder[preorder_root]);//先构建这个根节点
//左子树序列
int size_left = inorder_root - inorder_left;
//递归建立整个子树
root->left = myBuildTree(preorder,inorder,inorder_left,inorder_root-1,preorder_left+1,preorder_left+size_left);
root->right = myBuildTree(preorder,inorder,inorder_root+1,inorder_right,preorder_left+size_left+1,preorder_right);
return root;
}
};
void preorder1(TreeNode* root){
if(root==nullptr){
return;
}
cout<<root->val<<" ";
preorder1(root->left);
preorder1(root->right);
}
int main(){
vector<int> preorder = {3,9,20,15,7};
vector<int> inorder = {9,3,15,20,7};
Solution solution;
TreeNode* root = solution.buildTree(preorder,inorder);
preorder1(root);
}