將有序數組轉換爲二叉搜索樹【此後無良辰】

題面描述

在這裏插入圖片描述

基本思路

二叉搜索樹的中序遍歷是升序序列,題目給定的數組是按照升序排序的有序數組,因此可以確保數組是二叉搜索樹的中序遍歷序列。

給定二叉搜索樹的中序遍歷,是否可以唯一地確定二叉搜索樹?答案是否定的。如果沒有要求二叉搜索樹的高度平衡,則任何一個數字都可以作爲二叉搜索樹的根節點,因此可能的二叉搜索樹有多個
在這裏插入圖片描述

如果增加一個限制條件,即要求二叉搜索樹的高度平衡,是否可以唯一地確定二叉搜索樹?答案仍然是否定的。
在這裏插入圖片描述
直觀地看,我們可以選擇中間數字作爲二叉搜索樹的根節點,這樣分給左右子樹的數字個數相同或只相差 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;
    }
};

提交網站

在這裏插入圖片描述

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