109. 有序链表转换二叉搜索树
109. 有序链表转换二叉搜索树
给定一个单链表的头节点 head
,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。
示例 1:
输入: head = [-10,-3,0,5,9]
输出: [0,-3,9,-10,null,5]
解释: 一个可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜索树。
示例 2:
输入: head = []
输出: []
提示:
head
中的节点数在[0, 2 * 104]
范围内-105 <= Node.val <= 105
思路:
首先,构造一个BST需要做到树的左节点的值都小于根节点,右节点值都大于根节点。可以吧链表转化为数组进行操作
需要保证高度差不超过1,那么每次取中间值即可。
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
if(head==nullptr)return nullptr;
vector<int>v;//存储节点值
ListNode* p=head;
while(p!=nullptr){
v.push_back(p->val);
p=p->next;
}
//使用数组构造高度平衡的二叉树
return buildBST(v,0,v.size()-1);
}
TreeNode* buildBST(vector<int>&v,int left,int right){
if(left>right)return nullptr;//越界就为空节点
int mid=left+(right-left)/2;//取中间值
TreeNode* root=new TreeNode(v[mid]);
root->left=buildBST(v,left,mid-1);
root->right=buildBST(v,mid+1,right);
return root;
}
};
本文来自博客园,作者:{BailanZ},转载请注明原文链接:https://www.cnblogs.com/BailanZ/p/16323202.html