描述:
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定的有序链表: [-10, -3, 0, 5, 9],
一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
思路分析:
1、对于树的题目,首先分析如何将其拆解成子问题
2、由于链表不好操作,所以想办法将其放到数组里面(注意考虑数组大小的问题)
3、因为是有序的,所以每次取中间的节点为根就肯定不会有问题
4、问题拆解为:将一个数组构建成平衡二叉树 —》 将中间节点左边的数组段构建成平衡二叉树作为左节点 + 将右边段的数组构平衡二叉树作为右节点
5、由此可以递归求解
代码实现:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode helper(int[] nums, int h, int r) {
if (h > r) {
return null;
}
int mid = (h + r) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = helper (nums, h, mid - 1);
root.right = helper (nums, mid + 1, r);
return root;
}
public TreeNode sortedListToBST(ListNode head) {
int[] nums;
int r = 0;
int n = 0;
for (ListNode p = head; p != null; p = p.next) {
//nums[r] = p.val;
n++;
}
nums = new int[n];
for (ListNode p = head; p != null; p = p.next) {
nums[r] = p.val;
r++;
}
return helper(nums, 0 , r - 1);
}
}