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

Convert Sorted Array to Binary Search Tree

原题链接Convert Sorted Array to Binary Search Tree

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

给定一个地增序列,要求将其转化成一个高度平衡的二叉搜索树,高度平衡是指任意一个节点的左右子树的高度差绝对值都不能超过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

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

将递增链表转化成二叉搜索树,同样需要满足高度差要求

两种方法,

第一种,遍历一遍链表,将链表的值都记录在数组中,调用上面将递增序列转化成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年一切顺利!

新年快乐~

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/sinat_35261315/article/details/78944366
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞