×

【leetcode】109. Convert Sorted List to Binary Search Tree

96
_proto_麻瓜一袁
2017.04.23 01:22* 字数 157

Des:

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
首先看题目描述:给出一个顺序的单向链表,把它转换成一个平衡二叉树(开始还以为heiight在指高度,后来发现并不是这样)。


Question:

/**
 * 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) {
};

Mind:

既然是一个链表转换成平衡二叉树,也就是说我们设计一个算法,该算法会得出一个根节点/左子树/右子树即可,然后对左右子树不断递归该算法即可。


Answer:

//head 则为你的链表
var sortedListToBST = function(head) {
    if(!head) return null;   //链表为空则返回null   
    if(!head.next) return new TreeNode(head.val);  //head的下一个为空 则说明只有一个值,直接生成一个树

    var mid=head; 
    var pre=head;
    var last=head;
    
   //下面的while循环是为了确认根和子树,last移动2次,mid移动一次,pre为上次的mid,这种移动保证了mid两边的相对平衡
    while(last){
        last=last.next;
        if(last){
            pre=mid;
            mid=mid.next;
            last=last.next;
        }
    }
    
    pre.next=null;  // 注意pre 是做的对象引用 这里操作pre.next值为null,其实改变的是head中对应的next的值
    var root=new TreeNode(mid.val);  //递归调用
    root.left=sortedListToBST(head); //递归调用
    root.right=sortedListToBST(mid.next);//递归调用
    return root; 
};

Source URL:

<a href="https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/#/description">leetcode传送门</a>
<a href="https://github.com/yuanhaoyu/leetcode-review/blob/master/2017/109.js">codeDemo传送门</a>

学习栈
Web note ad 1