C++LeetCode 每日一题 - 有序链表转换二叉搜索树

题目链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/

Description

给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

Sample
给定的有序链表: [-10, -3, 0, 5, 9],

一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:

      0
     / \
   -3   9
   /   /
 -10  5
Solution
前置知识

平衡树(Balance Tree,BT) 指的是,任意节点的子树的高度差都小于等于1。常见的符合平衡树的有,B树(多路平衡搜索树)、AVL树(二叉平衡搜索树)等。平衡树可以完成集合的一系列操作, 时间复杂度和空间复杂度相对于“2-3树”要低,在完成集合的一系列操作中始终保持平衡,为大型数据库的组织、索引提供了一条新的途径。 —百度百科

那么,显然就是要将一个升序链表转换成一棵平衡二叉树!废话
平衡二叉树是一种特殊的二叉搜索 (排序) 树,而我们知道中序遍历一棵二叉排序树可以得到一个结点值递增的有序序列!题目所给的就是一个升序序列,那我们就可已利用这个性质来构造我们所需的平衡二叉树!

AC Code
class Solution {
public:
    vector<int> v;
    TreeNode* insertBST(int l,int r) {
	    if(l>=r) return nullptr;
	    int mid=(l+r)>>1;
	    TreeNode* root= new TreeNode(v[mid]);//类似中序遍历,来中序构造
	    root->left = insertBST(l,mid);
	    root->right = insertBST(mid+1,r);
	    return root;
    }
    
    TreeNode* sortedListToBST(ListNode* head) {
        if(head==NULL) return nullptr;
        while(head){
            v.push_back(head->val);//放进数组,方便取值
            head=head->next;
        }
        TreeNode * root=NULL;
        root=insertBST(0,v.size());
        return root;
    }
};

PS:觉得有帮助的话,点个赞再走吧!

你可能感兴趣的:(简单算法题—LeetCode,二叉树,leetcode)