(1) Convert Sorted Array to Binary Search Tree
根据[1],因为已经排好序,所以每次将中间节点作为根节点(保证为平衡树)。
class Solution {
private:
void buildBST(vector<int> &num, TreeNode * &root, int begin, int end){
if(begin>end)
return;
int mid=(begin+end)/2;
root=new TreeNode(num[mid]);
buildBST(num,root->left,begin,mid-1);
buildBST(num,root->right,mid+1,end);
}
public:
TreeNode *sortedArrayToBST(vector<int> &num) {
TreeNode *root=NULL;
if(num.size()>0)
buildBST(num,root,0,num.size()-1);
return root;
}
};
注意buildBST第二个参数需要用引用的指针,不然可能返回为NULL。
(2) Convert Sorted List to Binary Search Tree
根据[2],这题的关键是能找出当前链表的中间节点,然后再递归左右的子链表,开始的时候程序先计算链表总厂,然后传入两个前后索引指针,最后每次递归找出中间节点即可。
class Solution {
private:
TreeNode *buildBST(ListNode *root, int begin, int end){
if(begin>end)
return NULL;
int mid=(begin+end)/2;
ListNode *p=root;
for(int i=begin;i<mid;i++)
p=p->next;
TreeNode* left=buildBST(root,begin,mid-1);
TreeNode* right=buildBST(p->next,mid+1,end);
TreeNode* ret=new TreeNode(p->val);
ret->left=left;
ret->right=right;
return ret;
}
public:
TreeNode *sortedListToBST(ListNode *head) {
int len = 0;
ListNode *node=head;
while(node)
{
len++;
node = node->next;
}
return buildBST(head,0,len-1);
}
};
参考:
[1] http://jiyuede.blog.163.com/blog/static/332519212012112023814496/
[2] http://www.cnblogs.com/remlostime/archive/2012/10/29/2744805.html