LeetCode高频题:链表(五)

我们讲解的题目都是leetcode上经典的题目,而且我们的解答一定也是最简单最经典的。今天带来两道链表与树的经典题,把这两道放在一起讲是因为两者的思路是一致的。本期所用的链表的数据结构均如下:

public class ListNode {
     int val;
     ListNode next;
     ListNode(int x) { val = x; }
}
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

108. 将有序数组转换为二叉搜索树

题意:给一个递增的数组,返回一棵平衡的二叉搜索树,如下图
在这里插入图片描述

这道题是不是有点无厘头,乍一看好像毫无思绪,但是不一会儿我们就发现,有序数组转化为二叉搜索树就是一个知道中序遍历,还原出二叉树的过程。这道题无非就多了一个关键词:平衡。对于“平衡”我们如何解决?答案:每次使用二分确定根节点,就能做到平衡。代码如下:

public TreeNode sortedArrayToBST(int[] num) {
    if (num.length == 0)
        return null;
    return helper(num, 0, num.length - 1);
}
TreeNode helper(int[] num, int low, int high) {
    if (low > high)
        return null;
    int mid = (low + high) / 2;
    TreeNode node = new TreeNode(num[mid]);
    node.left = helper(num, low, mid - 1);
    node.right = helper(num, mid + 1, high);
    return node;
}

109. 有序链表转换二叉搜索树

题意:给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。如图:
在这里插入图片描述

这道题与上面那道题几乎一样,唯一的区别就是用链表代替了数组,那我们还是可以用上面那道题的“二分思想”来解这道题。代码如下:

public TreeNode sortedListToBST(ListNode head) { 
    if(head==null)
        return null;
    if(head.next==null)
        return new TreeNode(head.val);
    ListNode fast=head;
    ListNode slow=head;
    ListNode pre=null;
    while(fast!=null && fast.next!=null){
        fast=fast.next.next;
        pre=slow;
        slow=slow.next;
    }
    ListNode left=head;
    pre.next=null;
    TreeNode root=new TreeNode(slow.val);
    ListNode right=slow.next;
    root.left=sortedListToBST(left);
    root.right=sortedListToBST(right);
    return root;
}

明天,我们开始讲解动态规划的题目,你准备好了吗?

关注公众号,更多算法知识点告诉你。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值