LeetCode: 109. Convert Sorted List to Binary Search Tree
题目描述
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
Example:
Given the sorted linked list: [-10,-3,0,5,9]
,
One possible answer is: [0,-3,9,-10,null,5]
, which represents the following height balanced BST:
0
/ \
-3 9 / /
-10 5
题目大意: 根据给定的有序链表,生成一种可能的平衡二叉树。
解题思路
基本思路同 LeetCode: 108. Convert Sorted Array to Binary Search Tree 题解。由于给定数据结构是链表,因此只能先生成左子树,以使迭代指针指向链表中根节点的元素。
AC 代码
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */
class Solution {
private:
// 将 head 前 n 个元素生成平衡二叉树 BST
TreeNode* sortedListToBSTRef(ListNode*& head, int n)
{
if(head == nullptr || n <= 0) return nullptr;
// 生成左子树
TreeNode* leftChildTree = sortedListToBSTRef(head, n/2);
// 生成根节点
TreeNode* root = new TreeNode(head->val);
head = head->next;
// 生成右子树
TreeNode* rightChildTree = sortedListToBSTRef(head, n - n/2 - 1);
// 链接左/右子树
root->left = leftChildTree;
root->right = rightChildTree;
return root;
}
public:
TreeNode* sortedListToBST(ListNode* head) {
int n = 0; //记录节点个数
// 计算节点个数
ListNode* iter = head;
while(iter != nullptr && ++n) iter = iter->next;
return sortedListToBSTRef(head, n);
}
};