zoukankan      html  css  js  c++  java
  • [LeetCode#109]Convert Sorted List to Binary Search Tree

    The problem: 

    Convert Sorted List to Binary Search Tree

    Link:

    https://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/

    My analysis:

    The idea of building a binary tree from a sorted linked list is same as from a sorted array.
    The key issues here is:
    1. locate the mid element of linked list
    2. split the linked list into two parts according mid element.

    The classic way of finding the mid element on a linked list is to use two pointers: walker and runner.

    while (runner.next != null && runner.next.next != null) {
                
                pre_walker = walker;
                walker = walker.next;
                runner = runner.next.next;
    }

    Note: the mid element would be the node pointer by walker, to split the list into two parts, we have to keep a pre_walker pointer to point the previous element of walker.

    One pitfall.
    The corner case: when there are only two elements in the list.
    In this situation, we take the first element as root, the second element as the right child.
    In this case, the above invariant could not be used, we should tackle it specically. And, we could detect this case by testing if pre_walker has already been initialized.

    if (pre_walker == null) {
        head1 = null;
    } else { 
        head1 = head;
        pre_walker.next = null; 
    }

    Then the problem was fixed!

    My solution:

    public class Solution {
        public TreeNode sortedListToBST(ListNode head) {
            
            if (head == null)
                return null;
                
            return helper(head);
        }
        
        private TreeNode helper(ListNode head) {
        
            if (head == null)
                return null;
    
            if (head.next == null)
                return new TreeNode(head.val);
                
            ListNode head1;
            ListNode head2;
            ListNode walker = head;
            ListNode runner = head;
            ListNode pre_walker = null; //use to record the pre node of walker pointer
            ListNode mid;
    
            while (runner.next != null && runner.next.next != null) {
                
                pre_walker = walker;
                walker = walker.next;
                runner = runner.next.next;
            }
            
            mid = walker; //the mid position is pointed by walker
            TreeNode ret = new TreeNode(mid.val);
            
            /*
            if pre_walker has already been initialized, there are at list three elements left in the list.
            */
            if (pre_walker == null) { //careful! only two elements left, we choose the head as mid element.
                head1 = null;
            } else { 
                head1 = head;
                pre_walker.next = null; //split the original linked list at walker. 
            }
            
            head2 = mid.next;
            ret.left = helper(head1);
            ret.right = helper(head2);
            
            return ret; 
        }
    }
  • 相关阅读:
    jquery获取transform里面的值
    H5左滑删除JS插件
    IOS微信浏览器点击事件不起作用问题
    jquery获取不了ajax动态添加的内容的解决办法
    H5跟ios、android交互跟数据对接
    JS图片赖加载例子
    苹果手机浏览器下拉会闪动的解决办法
    jquery.rotate.js可选抽奖次数和中奖内容的转盘抽奖demo
    Html5的localStorage与sessionStorage五种循序渐进的使用方法
    tar 「解/壓」 包
  • 原文地址:https://www.cnblogs.com/airwindow/p/4209797.html
Copyright © 2011-2022 走看看