每天一道LeetCode-----将有序序列转成高度平衡二叉搜索树

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年一切顺利!

新年快乐~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值