Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
这个题目和 108 很像,只是108本身就是有序数组转化为平衡二叉树,这里是链表转化为平衡二叉树,所以首先的想法就是把有序链表转化为有序数组,在使用 108 的函数得到答案。
这个题目做完后觉得不太理想,于是参考了别人的算法,基本都是要先找到链表的长度,再使用递归的,所以我的这种方法,除了占用了一个数组长度的空间,在递归时,不需要重复查找每一项,算是比较好了。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {ListNode} head
* @return {TreeNode}
*/
var sortedListToBST = function(head) {
var nums=[];
var i=0;
var myList=function(head){
if(head) {
nums[i++]=head.val;
myList(head.next);
}
};
myList(head);
var sortedArrayToBST = function(nums) {
if(nums.length==1)return new TreeNode(nums[0]);
if(nums.length===0)return null;
var halfL=Math.floor(nums.length/2);
var root= new TreeNode(nums[halfL]);
root.left=sortedArrayToBST(nums.slice(0,halfL));
root.right=sortedArrayToBST(nums.slice(halfL+1));
return root;
};
return sortedArrayToBST(nums);
};