题目:Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 从给定的有序链表生成平衡二叉树。
1. Get the number of nodes获取链表大小n
2. make a balanced tree. (pre-order, bfs) 构造n个节点的平衡树
3. assign values. (in-order, dfs) 赋值
每步均为O(n) time
第2步需要 O(n) sapce
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
int len=0;
ListNode *p=head;
while(p){
len++;
p=p->next;
}
if(len==0) return NULL;
TreeNode* root=makeTree(len);
inorder(root,head);
return root;
}
TreeNode* makeTree(int n){
TreeNode *root=new TreeNode(0);
queue<TreeNode*> q;
q.push(root);
n--;
while(true){
if(n==0) break;
TreeNode *x=q.front();
q.pop();
x->left=new TreeNode(0);
q.push(x->left);
n--;
if(n==0) break;
x->right=new TreeNode(0);
q.push(x->right);
n--;
if(n==0) break;
}
return root;
}
ListNode* inorder(TreeNode* root,ListNode* node){
if (root->left != NULL)
node = inorder(root->left, node);
root->val = node->val;
node = node->next;
if (root->right != NULL)
node = inorder(root->right, node);
return node;
}
};