将单向有序链表转化为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;
}
对于快慢指针,这个是链表的一个必须要掌握的内功心法!
必须要多练练!
- 将单向有序链表转化为BST
- 将BST转换为有序的双向链表!
- 将两个单向有序链表合并成一个单向有序链表
- 将两个有序的单向链表整合成一个有序单向链表
- 将有序表转化为二叉搜索树
- 有序链表转换为平衡二叉树(BST)
- BST树转换为有序双向循环链表
- 二叉排序树转化为有序双向链表
- Convert Sorted List to Binary Search Tree 将有序链表转化为平衡二叉排序树
- 将双向链表转化为二叉堆并有序输出
- [进军硅谷]将二叉搜索树转化为一个有序的循环链表
- 将有序数组转化为二叉树
- 有序单向链表转换为平衡搜索二叉树
- LeeCode 109.Convert Sorted List to Binary Search Tree(将排序链表转化为BST) 解题思路和方法
- 1. BST树转化为双向链表
- 微软面试百题001——BST转化有序双向链表
- 有序链表转化为平衡的二分查找树
- 二叉搜索树转化为有序双向链表
- Thread 线程同步
- Android fragment基础
- Naming beans
- BZOJ 2049 [Sdoi2008]Cave 洞穴勘测 link cut trees 模板题
- convert numbers
- 将单向有序链表转化为BST
- hdu4612(缩点+树的直径)
- Mac virtualBox ubuntu17.4设置共享文件夹
- 关于thinkphp(或者PHP)session丢失或失效问题记录
- 如何实现一篇数据新闻报道
- java学习笔记(面向对象、类的使用、方法的重载)
- C~K玩游戏
- 数据结构:排序算法
- C++结构体和类介绍