二叉树
本题将listnode转化为BST
Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are
本题将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;
}