DFS
算法概论第三周
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
思路分析
- 每次将排好序的链表分成长度相同(或相差1)两段
- 这样可以保证树的左右两边平衡
- 递归处理两段
- 注意考虑链表只有一个元素和没有元素的情况
- 注意分两段的时候,链表要合理截断
代码实现
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
return dfs(head);
}
TreeNode* dfs(ListNode* head){
//处理特殊情况
if(head == NULL)
return NULL;
//分段链表
ListNode* hhead = getHalf(head);
//生成父节点
TreeNode* res = new TreeNode(hhead->val);
if(hhead == head)
return res;
//分别处理两段
res->left = dfs(head);
res->right = dfs(hhead->next);
hhead->next = NULL;
return res;
}
ListNode* getHalf(ListNode* aim){
//找到中间的节点
int count = 0;
ListNode* now = aim;
while(now != NULL){
count++;
now = now->next;
}
if(count == 1){
return aim;
}
int halfNum = count/2;
count = 1;
now = aim;
while(count != halfNum){
count++;
now = now->next;
}
ListNode* rec = now->next;
now->next = NULL;
return rec;
}
};