leetcode做题笔记109. 有序链表转换二叉搜索树

给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差不超过 1。

思路一:递归+双指针

cpp 复制代码
struct ListNode* getMedian(struct ListNode* left, struct ListNode* right) {
    struct ListNode* fast = left;
    struct ListNode* slow = left;
    while (fast != right && fast->next != right) {
        fast = fast->next;
        fast = fast->next;
        slow = slow->next;
    }
    return slow;
}

struct TreeNode* buildTree(struct ListNode* left, struct ListNode* right) {
    if (left == right) {
        return NULL;
    }
    struct ListNode* mid = getMedian(left, right);
    struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    root->val = mid->val;
    root->left = root->right = NULL;
    root->left = buildTree(left, mid);
    root->right = buildTree(mid->next, right);
    return root;
}

struct TreeNode* sortedListToBST(struct ListNode* head) {
    return buildTree(head, NULL);
}

分析:

本题给定一个链表的头节点求二叉搜索树,与上题相同,先找根节点,再将左右子树通过递归的方式补充完整,利用双指针的方法让快指针先到链表结尾再将中间的值赋给二叉树来创建二叉搜索树,最后输出二叉树根节点

总结:

本题考察二叉搜索树与链表的综合应用,利用双指针找到根节点即可解决

相关推荐
looklight19 分钟前
7. 整数反转
c++·算法·leetcode·职场和发展
不太可爱的叶某人1 小时前
【学习笔记】深入理解Java虚拟机学习笔记——第3章 垃圾收集器与内存分配策略
java·笔记·学习
緈福的街口2 小时前
【leetcode】36. 有效的数独
linux·算法·leetcode
半导体守望者2 小时前
Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁
经验分享·笔记·功能测试·自动化·制造
晨曦backend3 小时前
Vim 复制/剪切/粘贴命令完整学习笔记
笔记·学习·vim
GoldenaArcher4 小时前
Fullstack 面试复习笔记:HTML / CSS 基础梳理
笔记·面试·html
DIY机器人工房4 小时前
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
笔记·科技·学习
青椒大仙KI114 小时前
25/6/11 <算法笔记>RL基础算法讲解
笔记·学习
爱上妖精的尾巴5 小时前
3-16单元格区域尺寸调整(发货单记录保存-方法2)学习笔记
javascript·笔记·学习·wps·js宏·jsa
LuLaLuLaLeLLLLLL6 小时前
MySQL 基础笔记
数据库·笔记·mysql