LintCode 106-排序列表转换为二分查找树

本文介绍了一种将已排序的单链表转换为高度平衡二分查找树的方法。核心思路是通过递归方式每次选取链表中间元素作为根节点,并继续递归构建左右子树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本人电子系,只为一学生。心喜计算机,小编以怡情。


给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树


思路:很容易想到了要每次取中,也很容易的想到了要用递归来做。
注意:使用ArrayList的subList要用List来定义。
如:List temp=new ArrayList();

  public TreeNode sortedListToBST(ListNode head) {  
        // write your code here

        if(head==null) return null;
        //链表转换成List,为了以后的subList与get容易一些
        //当然也可以不这样做,只是定位会比较麻烦
        List<Integer>  temp=new ArrayList<Integer>();
        while(head!=null)
        {
            temp.add(head.val);
            head=head.next;
        }
        //调用retree方法,构造二分查找树
        TreeNode ret=retree(temp);

        return ret;


    }
    public TreeNode retree(List<Integer> temp)
    {
        //当子链表长度不同时,mid的定位也不同
        int mid=0;
        if(temp.size()%2==0)
            mid=temp.size()/2-1;
        else {
            mid=temp.size()/2;
        }

        //注意mid的范围,要进行检查否则会报错
        if(mid<0||mid>=temp.size()) return null;
        //构造新树的结点
        TreeNode head=new TreeNode(temp.get(mid));
        //建立连接
        head.left=retree( temp.subList(0, mid));
        head.right=retree( temp.subList(mid+1, temp.size()));

        return head;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值