Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
Example:
Given the sorted linked list: [-10,-3,0,5,9], One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST: 0 / \ -3 9 / / -10 5
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
想法:根据BST的中序遍历是升序的,首先利用快慢指针找到已排序链表的中间节点,作为根节点。然后递归根节点左边的部分和右边的部分。最后构成BST。
(不得不感慨,使用c++刷题比使用c语言方便很多。)埋头奋进,继续自己的刷题之旅。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* sortedListToBST(ListNode* head) { return BuildBST(head,NULL); } TreeNode* BuildBST(struct ListNode* head, struct ListNode* end){ if(head == end) return NULL; struct ListNode* fast = head; struct ListNode* slow = head; while(fast != end && fast->next != end){ slow = slow->next; fast = fast->next->next; } struct TreeNode* root = new TreeNode(slow->val); root->left = BuildBST(head,slow); root->right = BuildBST(slow->next,end); return root; } };