您的位置:首页 > 其它

有序递增链表转化为平衡的二叉搜索树(LeetCode: Convert Sorted List to Binary Search Tree )

2015-01-27 15:47 525 查看
首先,这里是有序递增链表,那么链表的中间节点一定是二叉搜索树的根节点,左侧一半为左子树,右侧一半为右子树,这可以构建一个递归的过程。那么如何找到链表的中间节点呢?

方法1:将链表转化为vector(增加了额外的存储空间用来方便获取中间节点,构建递归过程)

class Solution {
public:
TreeNode *sortedListToBST(ListNode *head) {
if(head==NULL)
return NULL;
vector<int> vec;
ListNode *current = head;
while(current){
vec.push_back(current->val);
current = current->next;
}
return constructTree(vec,0,vec.size()-1);
}

private:
TreeNode *constructTree(vector<int> &vec,int start,int end){
if(start>end)
return NULL;
int mid = (start+end)/2;
TreeNode *root = new TreeNode(vec[mid]);
root->left = constructTree(vec,start,mid-1);
root->right = constructTree(vec,mid+1,end);
return root;
}
};


方法2:二叉搜索树的中序遍历结果就是有序递增序列,可以利用中序遍历的方法将有序链表转成二叉搜索树,在遍历到树上的某一节点时,读取链表的值(没有额外分配内存,效率优于方法1)。

class Solution {
public:
TreeNode *sortedListToBST(ListNode *head) {
if(head==NULL)
return NULL;
ListNode *current = head;
int len = 1;
while(current=current->next)
++len;
return inOrder(head,0,len-1);
}

private:
TreeNode *inOrder(ListNode *&head,int left,int right){//这里需要使用指针的引用
if(left>right)
return NULL;
int mid = (left+right)/2;
TreeNode *root = new TreeNode(0);
root->left = inOrder(head,left,mid-1);
root->val = head->val;
head = head->next;
root->right = inOrder(head,mid+1,right);
return root;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐