Return the root node of a binary search tree that matches the given
preorder
traversal.(Recall that a binary search tree is a binary tree where for every node, any descendant of
node.left
has a value<
node.val
, and any descendant ofnode.right
has a value>
node.val
. Also recall that a preorder traversal displays the value of thenode
first, then traversesnode.left
, then traversesnode.right
.)
Example 1:
Input: [8,5,1,7,10,12] Output: [8,5,10,1,7,null,12]
Note:
1 <= preorder.length <= 100
- The values of
preorder
are distinct.
我们可以利用前序遍历,在配合上二叉搜索树的特征进行重建树 。
由于二叉搜索树中,root结点总比左儿子大,比右儿子小,于是,我们就可以利用这个条件,通过对根结点的左儿子、右儿子分别划分数值上下限,通过判断当前遍历到的元素的数值是否在这个划分的区间内,如果在这个区间内,则把元素放进这个位置,如果不在这个区间内,继续找下一个位置,看栗子:
ac代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int idx;
TreeNode* bstFromPreorder(vector<int>& preorder) {
idx=0;
return build(preorder,-999999,999999);
}
TreeNode* build(vector<int>& nums,int lower,int upper){
if(idx==nums.size() || nums[idx]>upper || nums[idx]<lower)return NULL; //不在划分的区间内
int val=nums[idx++];
TreeNode *t = new TreeNode(val);
t->left = build(nums,lower,val);
t->right = build(nums,val,upper);
return t; //在儿子新建一个结点,把新建的结点的地址告诉父结点
}
};