返回与给定先序遍历
preorder
相匹配的二叉搜索树(binary search tree)的根结点。
(回想一下,二叉搜索树是二叉树的一种,其每个节点都满足以下规则,对于 node.left 的任何后代,值总< node.val
,而node.right
的任何后代,值总> node.val
。此外,先序遍历首先显示节点的值,然后遍历node.left
,接着遍历node.right
。)
.
输入:[8,5,1,7,10,12]
输出:[8,5,10,1,7,null,12]
数组首元素为树根,找到第一个大于首元素的索引i,则数组[1,i)
都是左子树节点,数组[i,n)
都是右子树节点。
class Solution {
public:
TreeNode* bstFromPreorder(vector<int>& preorder) {
if(preorder.empty())return nullptr;
int n=preorder.size();
return reduce(preorder,0,n);
}
TreeNode* reduce(vector<int>& preorder,int start,int end){
//[start+1,i)左子树,[i,end)右子树
if(start>=end)return nullptr;
int i=start+1;
for(;i<end&&preorder[i]<preorder[start];i++);
TreeNode* root=new TreeNode(preorder[start]);
root->left=reduce(preorder,start+1,i);
root->right=reduce(preorder,i,end);
return root;
}
};