力扣-105.从前序与中序遍历序列构造二叉树
题目描述
给定两个整数数组 preorder
和 inorder
,其中 preorder
是二叉树的先序遍历, inorder
是同一棵树的中序遍历,请构造二叉树并返回其根节点。
class Solution {
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {if(preorder.size()==0)return NULL;TreeNode* root = new TreeNode(preorder[0]);if(preorder.size()==1)return root;int index = 0;for (int i = 0; i < inorder.size(); ++i) {if(inorder[i]==preorder[0])index = i;}vector<int> leftIn(inorder.begin(), inorder.begin()+index);vector<int> rightIn(inorder.begin()+index+1, inorder.end());vector<int> leftPre(preorder.begin()+1,preorder.begin()+1+index);vector<int> rightPre(preorder.begin()+1+index,preorder.end());root->left = buildTree(leftPre,leftIn);root->right = buildTree(rightPre,rightIn);return root;}
};
小结:递归的思路也是非常清晰,C++
的vector
切割数组真的很方便,大概思路就是先用先序集合确定根结点,再找到在中序的位置,之后切割、递归。