Convert Sorted Array to Binary Search Tree
原题链接Convert Sorted Array to Binary Search Tree
给定一个地增序列,要求将其转化成一个高度平衡的二叉搜索树,高度平衡是指任意一个节点的左右子树的高度差绝对值都不能超过1(实际上就是一个AVL树的要求)
首先考虑根节点,要想让根节点的两个子树的高度差不能超过1,那么就需要尽量保证左右子树的元素个数是相同的,所以很自然的想到将递增序列分成左右两部分,这两部分元素个数相同
根节点考虑完后,其他节点就照葫芦画瓢即可
代码如下
/**
* 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) {
return toBST(nums, 0, nums.size() - 1);
}
private:
TreeNode* toBST(vector<int>& nums, int start, int end)
{
if(start > end) return nullptr;
/* 找到中间的元素作为根节点,左右两边分别是左右子树的元素,以保证高度差要求 */
int middle = start + (end - start) / 2;
TreeNode* root = new TreeNode(nums[middle]);
root->left = toBST(nums, start, middle - 1);
root->right = toBST(nums, middle + 1, end);
return root;
}
};
Convert Sorted List to Binary Search Tree
原题链接Convert Sorted List to Binary Search Tree
将递增链表转化成二叉搜索树,同样需要满足高度差要求
两种方法,
第一种,遍历一遍链表,将链表的值都记录在数组中,调用上面将递增序列转化成BST的函数
第二种,利用上面的思想,每次找中间值,当然这次需要在链表上执行
第二种方法,需要每次找到链表的中间位置,这里使用walker和runner方法,代码如下
/**
* 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 toBST(head, nullptr);
}
private:
TreeNode* toBST(ListNode* head, ListNode* tail)
{
if(head == tail) return nullptr;
ListNode* walker = head;
ListNode* runner = head;
/* 寻找链表head到tail的中间位置 */
while(runner != tail && runner->next != tail)
{
walker = walker->next;
runner = runner->next->next;
}
/* 结束后,walker是链表中间位置 */
TreeNode* root = new TreeNode(walker->val);
root->left = toBST(head, walker);
root->right = toBST(walker->next, tail);
return root;
}
};
这两道题主要利用高度差的条件进行求解,因为高度差不能超过1,所以就需要保证左右两边尽量拥有相同数量的元素,那么就可以想到将中间元素作为根节点,依次递归
今天是2018年的第一天,刚刚跨完年,好多事情想说但是不知道从哪说起,就在此祝所有人2018年一切顺利!
新年快乐~