给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。
示例 1:
输入: head = [-10,-3,0,5,9]
输出: [0,-3,9,-10,null,5]
解释: 一个可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜索树。
示例 2:
输入: head = []
输出: []
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/convert-sorted-list-to-binary-search-tree
思路:
将给定的有序链表转换为二叉搜索树的第一步是确定根节点。由于我们需要构造出平衡的二叉树,因此让根节点左子树中的节点个数与右子树中的节点个数尽可能接近。如此,左右子树的高度也会非常接近,可以达到高度差绝对值不超过 1 的题目要求。
根据中位数的性质,链表中小于中位数的元素个数与大于中位数的元素个数要么相等,要么相差 1。此时,小于中位数的元素组成了左子树,大于中位数的元素组成了右子树,它们分别对应着有序链表中连续的一段。
在这之后,我们使用分治的思想,继续递归地对左右子树进行构造,找出对应的中位数作为根节点,以此类推。
链接:https://leetcode.cn/problems/convert-sorted-list-to-binary-search-tree/solution/you-xu-lian-biao-zhuan-huan-er-cha-sou-suo-shu-1-3/
c++
- /**
- * Definition for singly-linked list.
- * struct ListNode {
- * int val;
- * ListNode *next;
- * ListNode() : val(0), next(nullptr) {}
- * ListNode(int x) : val(x), next(nullptr) {}
- * ListNode(int x, ListNode *next) : val(x), next(next) {}
- * };
- */
- /**
- * Definition for a binary tree node.
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode() : val(0), left(nullptr), right(nullptr) {}
- * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
- * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
- * };
- */
- class Solution {
- public:
- ListNode* getMiddleNode(ListNode* left, ListNode* right) {
- ListNode* slow = left;
- ListNode* fast = left;
-
- while(fast != right && fast->next != right) {
- slow = slow->next;
- fast = fast->next;
- fast = fast->next;
- }
-
- return slow;
- }
-
- TreeNode* buildTree(ListNode* left, ListNode* right) {
- if(left==right) {
- return nullptr;
- }
-
- ListNode* midNode = getMiddleNode(left,right);
- TreeNode* root = new TreeNode(midNode->val);
- root->left = buildTree(left,midNode);
- root->right = buildTree(midNode->next,right);
-
- return root;
- }
-
- TreeNode* sortedListToBST(ListNode* head) {
- return buildTree(head,nullptr);
- }
- };