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

来源:互联网 发布:vb as boolean 编辑:程序博客网 时间:2024/03/29 03:33

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

    方法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;}};



0 0