将有序数组转换为二叉搜索树【此后无良辰】

题面描述

在这里插入图片描述

基本思路

二叉搜索树的中序遍历是升序序列,题目给定的数组是按照升序排序的有序数组,因此可以确保数组是二叉搜索树的中序遍历序列。

给定二叉搜索树的中序遍历,是否可以唯一地确定二叉搜索树?答案是否定的。如果没有要求二叉搜索树的高度平衡,则任何一个数字都可以作为二叉搜索树的根节点,因此可能的二叉搜索树有多个
在这里插入图片描述

如果增加一个限制条件,即要求二叉搜索树的高度平衡,是否可以唯一地确定二叉搜索树?答案仍然是否定的。
在这里插入图片描述
直观地看,我们可以选择中间数字作为二叉搜索树的根节点,这样分给左右子树的数字个数相同或只相差 11,可以使得树保持平衡。如果数组长度是奇数,则根节点的选择是唯一的,如果数组长度是偶数,则可以选择中间位置左边的数字作为根节点或者选择中间位置右边的数字作为根节点,选择不同的数字作为根节点则创建的平衡二叉搜索树也是不同的。
(以上为官方题解)
综上所述,其实就是给定二叉搜索树的中序遍历,加不加上平衡因子的限定都不唯一
对于中序遍历利用递归构造即可

/**
 * 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:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return Build(nums,0,nums.size()-1);
    }
    TreeNode* Build(vector<int> &nums,int l,int r)
    {
        if(l>r)
        return NULL;
        int mid=(r+l)/2;
        TreeNode* root= new TreeNode(nums[mid]);
        root->left=Build(nums,l,mid-1);
        root->right=Build(nums,mid+1,r);
        return root;
    }
};

提交网站

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章