Convert Sorted List to Binary Search Tree

二叉树


本题将listnode转化为BST


Convert Sorted List to Binary Search Tree


Given a singly linked list where elements are


sorted in ascending order, convert it to a height balanced BST.



#include<iostream>
#include<vector>

using namespace std;
struct ListNode
{
	int val;
	ListNode *next;
	ListNode(int x) :val(x), next(nullptr) {}

};

struct TreeNode
{
	int val;
	TreeNode *l;
	TreeNode *r;
	TreeNode(int x) :val(x), l(nullptr), r(nullptr) {}
};





class Solution
{ 
public:
	ListNode *init(vector<int> &vec) //链表的初始化
	{
		ListNode dumy(-1);
		ListNode *temp = &dumy;
		for (int i = 0; i < vec.size(); i++, temp = temp->next)
		{
			temp->next = new ListNode(vec[i]);
		}
		return dumy.next;
	}

	TreeNode *SortlistToBST(ListNode *head)
	{
		return sortlistToBST(head, listlen(head));
	}

	TreeNode *sortlistToBST(ListNode *head, int len)
	{
		if (len == 0) return nullptr;
		if (len == 1) return new TreeNode(head->val);

		TreeNode *root = new TreeNode(nth_node(head, len/2+1)->val);
		root->l = sortlistToBST(head, len / 2);
		root->r = sortlistToBST(nth_node(head, len / 2 + 2), (len - 1) / 2);//(len-1)/2+len/2+1=len

		return root;
	}


	ListNode *nth_node(ListNode* head, int len)
	{
		while (--len)
		{
			head = head->next;
		}
		return head;

	}


	int listlen(ListNode *head) //中序输出
	{
		int n = 0;
		while (head != nullptr)
		{
			++n;
			head = head->next;
		}
		return n;
	}


	void midorder(TreeNode *root)
	{
		if (root != nullptr)
		{
			midorder(root->l);
			cout<< root->val<<",";
			midorder(root->r);
		}
	}

};


int main()
{
	Solution s1;
    vector<int> vec{ 1, 2, 3, 4, 5};
	ListNode *list;
	
	list = s1.init(vec);
	s1.midorder(s1.SortlistToBST(list));
	cout << endl;
	system("pause");
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值