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;
}
对于快慢指针,这个是链表的一个必须要掌握的内功心法!
必须要多练练!