题目描述
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
给定一个已排好序的链表,构建其相应的二叉搜索树。
解题思路
看到题目,映入眼帘的肯定是递归方法:
- 找到待构建链表的中间位置,将其对应的treeNode提出作为根节点(root);
- 构建中间位置左边链表的BST,返回结果作为root.left;
- 构建 中间位置的右边链表的BST,返回结果作为root.right;
代码实现中,我没有直接操作链表,而是首先根据linked list生成对应的ArrayList<TreeNode>,然后对ArrayList<TreeNode>进行递归求解,具体解法请看下面代码。
代码
/**
* 根据已排序列表构建二叉搜索树
* @param head
* @return
*/
public static TreeNode sortedListToBST(ListNode head) {
ArrayList<TreeNode> list = new ArrayList<TreeNode>();
if(head==null)
return null;
//通过链表的值构建treenode并存储到list中
while (head != null) {
list.add(new TreeNode(head.val));
head = head.next;
}
return buildBST(0, list.size() - 1, list);
}
/**
* 构建二叉搜索树
* @param start 待构建二叉树的treeNode列表的起始位置
* @param end 待构建二叉树的treeNode列表的结束位置
* @param list
* @return
*/
public static TreeNode buildBST(int start, int end, ArrayList<TreeNode> list) {
int middle = start + (end - start) / 2;//中间节点
TreeNode root = list.get(middle);
if(start==end){
return root;
}
if (middle - 1 >= start) {
root.left = buildBST(start, middle - 1, list);
}
if (middle + 1 <= end) {
root.right = buildBST(middle + 1,end, list);
}
return root;
}