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

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

    方法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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值