题目内容
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例
给定的有序链表: [-10, -3, 0, 5, 9],
一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:
题解
本题与上一题有相似之处,即均需要转化为高度平衡的二叉搜索树。但不同点在于,数组对于取中点这个操作是O(1)的时间复杂度,而取链表的重点则是O(n)的时间复杂度。这里有个取巧的办法就是将链表转化为数组,然后代码与上一题的代码完全一致,因此这里不讲。这里,还是按照上一题的思路直接去实现。
具体,请看代码注释。
代码
class Solution { public: TreeNode* sortedListToBST(ListNode* head) { if(!head) return nullptr; int n = 0; for(auto p = head;p;p=p->next) n++; if(n==1) return new TreeNode(head->val); auto cur = head;
for(int i = 0; i < n / 2 - 1; i++)cur = cur->next; auto root = new TreeNode(cur->next->val); root->right = sortedListToBST(cur->next->next); cur->next = nullptr; root->left = sortedListToBST(head); return root; } };
|