将单向有序链表转化为BST

来源:互联网 发布:天网塞班软件站 编辑:程序博客网 时间:2024/05/17 22:02
原题目为

Leetcode的Convert Sorted List to Binary Search Tree



/**树和链表的定义
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; next = null; }
 * }
 */
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */


BST,二叉搜索树,小的在左边,大的在右边这个大家都知道- -

怎样从一个有序的单向链表转化为BST呢?其实挺简单的,首先从BST原理出发

BST的根节点其实就是等于一个有序数组中的中间那个大兄弟

比喻,现在要转化为BST的不是链表,而是一个有序的数组,一共有n个数。这样的话就更加简单,我们来分析一下

1,首先我们通过下标找出中间的那个数作为根节点,假设下表为x

2,那么下标0~x-1的数肯定比x小,x+1~n-1的数比x大,将其分成三段

3 新建根节点root的值为 下标X的数值,然后root的左孩子的值就是等于下标0~x-1的中间的下标的值,而右孩子就是x+1~n中间的下标的值,去到这一步大家都知道其实就是重复着1跟2,不停的递归下去,只要设置好递归的退出就能轻易转化好这个BST


好了,回到我们的问题

单向链表跟数组转化为BST唯一的不同就是找他的中间那个兄弟比较麻烦。

这时我们就需要动用单向链表最喜欢用的快慢指针了,一快一慢,轻轻松松找到中间的

(假如不理解快慢指针的可以直接看代码,然后直接画个链表出来模拟一下,一次生两次熟)

当找到中间的大兄弟的时候,其他操作其实跟数组没什么区别,下面直接贴出代码。




 public TreeNode sortedListToBST(ListNode head) {
        if(head==null)
            return null;
        if(head.next == null) return new TreeNode(head.val);
        ListNode kuai=head;
        ListNode man=head;
        ListNode preMid = null;
        while(kuai!=null&&kuai.next!=null){
            preMid=man;
            kuai=kuai.next.next;
            man=man.next;
        }
        TreeNode sb=new TreeNode(man.val);
        preMid.next = null;
        sb.left=sortedListToBST(head);
        sb.right=sortedListToBST(man.next);
        return sb;
    }


对于快慢指针,这个是链表的一个必须要掌握的内功心法!

必须要多练练!













原创粉丝点击