108. Convert Sorted Array to Binary Search Tree
Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
/**
* 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* sortedArrayToBST(vector<int>& nums) {
int sz=nums.size();
if(nums.empty()) return nullptr;
int mid=sz/2;
TreeNode *root=new TreeNode(nums[mid]);
vector<int> left(nums.begin(),nums.begin()+mid);
root->left=sortedArrayToBST(left);
vector<int> right(nums.begin()+mid+1,nums.end());
root->right=sortedArrayToBST(right);
return root;
}
/*总结:
*1、没有要求用非递归,一般递归解决;
*2、要求非递归,先将递归形式写出,然后改。
*3、递归有助于理解。
*/
};
109. 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.
可以看到我就只是在前一个代码基础上改了一下。我开始觉得这个题目肯定要不断的遍历部分链表,用来寻找中间节点。后来发现,其实也不是那么回事。
/**
* 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) {
vector<int> nums;
for(ListNode *p=head;p!=nullptr;p=p->next)
{
nums.push_back(p->val);
}
return sortedArrayToBST(nums);
}
private:
TreeNode* sortedArrayToBST(vector<int>& nums) {
int sz=nums.size();
if(nums.empty()) return nullptr;
int mid=sz/2;
TreeNode *root=new TreeNode(nums[mid]);
vector<int> left(nums.begin(),nums.begin()+mid);
root->left=sortedArrayToBST(left);
vector<int> right(nums.begin()+mid+1,nums.end());
root->right=sortedArrayToBST(right);
return root;
}
};
Reference:
https://discuss.leetcode.com/topic/8141/share-my-o-1-space-and-o-n-time-java-code
看了这段代码后,我发现别人写的很巧妙。
下面贴出来写点注释。
private ListNode node;
public TreeNode sortedListToBST(ListNode head) {
if(head == null){
return null;
}
int size = 0;
ListNode runner = head;
node = head;//头节点
//获得长度
while(runner != null){
runner = runner.next;
size ++;
}
return inorderHelper(0, size - 1);
}
public TreeNode inorderHelper(int start, int end){
if(start > end){
return null;
}
int mid = start + (end - start) / 2;
TreeNode left = inorderHelper(start, mid - 1);
TreeNode treenode = new TreeNode(node.val);
treenode.left = left;
node = node.next;
/*以中序遍历的形式,在生成父节点之前已经到达BST最左
*然后一次一次生成父节点,到达最外围时候
*node已经跑到了链表中点
*/
TreeNode right = inorderHelper(mid + 1, end);
treenode.right = right;
return treenode;
}