有序链表转换二叉搜索树

这道题跟将有序数组转换为二叉搜索树有点相似

题目描述

给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1

示例1

给定的有序链表: [-10, -3, 0, 5, 9],

一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:

      0
     / \
   -3   9
   /   /
 -10  5

分析

代码

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {ListNode} head
 * @return {TreeNode}
 */
var sortedListToBST = function(head) {
    let array = getSortedList(head);
    let res = toBST(array);
    return res;
};

var getSortedList = function(head) {
    let result = [];
    let p = head;

    while(p != null) {
        result.push(p.val);
        p = p.next;
    }

    return result;    
}

var toBST = function(array) {
    let length = array.length;

    if(length == 0) {
        return null
    }

    let mid = Math.floor(length / 2);
    let left = array.slice(0, mid);
    let right = array.slice(mid + 1, length);

    let root = new TreeNode(array[mid]);
    root.left = toBST(left);
    root.right = toBST(right);

    return root;
}