将单向有序链表转化为BST

本文介绍如何将有序链表转换为二叉搜索树(BST),利用快慢指针找到中间节点作为根节点,并递归地构建左右子树。
原题目为

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;
    }


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

必须要多练练!













评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值