我们讲解的题目都是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;
}
明天,我们开始讲解动态规划的题目,你准备好了吗?
关注公众号,更多算法知识点告诉你。