题目
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
解题思路
二叉搜索树的中序遍历,刚好是呈升序的。由此得出,应该使用中序建树的方式。
同时题目要求是高度平衡的二叉搜索树,所以我们需要找到链表的中间点(可以让一个 runner 节点找),从中间开始建树,高度一定是平衡的。
mid
/ \
/ \
解题代码
class Solution {
private ListNode node;
public TreeNode sortedListToBST(ListNode head) {
ListNode runner = head;
node = head;
// 得到链表的程度
int size = 0;
while(runner != null){
size++;
runner = runner.next;
}
return buildTree(0, size-1);
}
// 中序递归建树
public TreeNode buildTree(int start, int end){
if(start > end) return null; // 没有建树空间,返回null
int mid = (start + end) / 2;
TreeNode left = buildTree(start, mid-1);
// ↓
// 跑到最左边的时候就会执行这个新建命令
TreeNode treenode = new TreeNode(node.val);
treenode.left = left;
node = node.next;
TreeNode right = buildTree(mid+1, end);
treenode.right = right;
return treenode;
}
}