题目描述:
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定的有序链表: [-10, -3, 0, 5, 9],
一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:
方法1:将链表转成数组,递归建立树
主要思路:
(1)链表不具有随机访问性,可先将链表结点中的数值,存储到对应的数组位置,然后使用数组建立树;
(2)使用数组建立树时,每次以数组范围的中间元素作为根节点建立树,然后再把数组的左侧部分作为树的左子树部分,数组的右侧部分作为树的右侧部分,递归建立左右子树;
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
/**
* 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* helper(vector<int>& nodes,int left,int right){
//说明该范围内不再有元素
if(left>right)
return NULL;
//获得该范围内的中间元素位置
int mid=left+(right-left)/2;
//使用中间元素建立根节点
TreeNode* root=new TreeNode(nodes[mid]);
//将数组的左右部分,作为该根节点的左右子树,递归建立
root->left=helper(nodes,left,mid-1);
root->right=helper(nodes,mid+1,right);
//返回根节点
return root;
}
TreeNode* sortedListToBST(ListNode* head) {
//处理特殊的情形
if(head==NULL)
return NULL;
if(head->next==NULL)
return new TreeNode(head->val);
//将链表转成对应的数组
vector<int> nodes;
while(head){
nodes.push_back(head->val);
head=head->next;
}
//使用数组建立树
return helper(nodes,0,nodes.size()-1);
}
};