题目描述:
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
输入输出示例:
输入:
给定的有序链表: [-10,-3,0,5,9]
输出:
一个可能的答案是:[0,-3,9,-10,null,5]
它可以表示下面这个高度平衡的二叉搜索树
对于该题有三种解题方法:
- 转成数组+递归;
- 快慢指针+递归;
- 中序遍历模拟;
解法一:转成数组+递归
解题思路:
平衡二叉树的特点就是:左子树中所有节点的值都小于根节点的值,右子树中所有节点的值都大于根节点的值。题目要求最终返回一棵高度平衡的二叉搜索树(即AVL树),所以关键就是确定这个树的根节点,也就是找到有序链表中处于中间位置的元素,将其设为根节点,然后将该元素之前的所有元素作为该根节点的左子树,该元素之后的所有元素作为该根节点的右子树;进入左子树,找到根节点元素之前元素中处于中间位置的元素作为左子树的根节点…;右子树相同;为了便于找到中间元素,所以将单链表转换成数组。
解法一与解法二相比,就相当于:用空间换时间的经典方式;
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
vector<int> arr;
ListNode* temp = head;
//将单链表转换成数组
while (temp)
{
arr.push_back(temp->val);
temp = temp->next;
}
return CreateTree(arr, 0, arr.size() - 1);
}
TreeNode* CreateTree(vector<int>& arr, int left, int right)
{
if (left>right)
return nullptr;
if (left