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

1、二分法+递归

TreeNode* sortedListToBST(ListNode* head) {vector<int> v;while(head!=NULL){//先将链表值存入数组中v.push_back(head->val);head=head->next;}int size=v.size();return ToBSTBetween(v,0,size-1);
}TreeNode* ToBSTBetween(vector<int> &v,int m,int n){//用二分法递归if(m>n) return NULL;int mid=(m+n)/2;TreeNode *root=new TreeNode(v[mid]);root->left=ToBSTBetween(v,m,mid-1);root->right=ToBSTBetween(v,mid+1,n);return root;
}

2、快慢指针+递归

通过快慢指针找到每次递归的中点p,然后对head和p->next分别进行递归

TreeNode* sortedListToBST(ListNode* head) {if(head==NULL){return NULL;}ListNode *mid=FindMid(head);//返回p为头节点的链表TreeNode *node=new TreeNode(mid->val);//将p节点的值保存到nodeif(head==mid){return node;}node->left=sortedListToBST(head);//递归以head为头节点的链表node->right=sortedListToBST(mid->next);//递归以p->next为头节点的链表return node;
}ListNode* FindMid(ListNode* head){ListNode *pre=NULL,*p=head,*q=head;while(q!=NULL&&q->next!=NULL){//q每次都比p多走一步,这样当q到终点时,p正好到中间,用pre记录p前一个节点pre=p;q=q->next->next;p=p->next;}if(pre!=NULL){pre->next=NULL;//从p点断开,分为以head和p为头节点的两个链表}return p;//返回以p为头节点的两个链表
}

3、中序遍历★

ListNode *head;int GetSize(ListNode* head){int nsize=0;while(head !=NULL){nsize+=1;head = head->next;}return nsize;
}TreeNode* convertToBST(int start,int end){if (start>=end){return NULL;}int mid = (end+start)/2;//模拟中序遍历,找到中间元素(start+end)/2,这里不需要在链表中找到确定元素是哪个,只需要用一个遍历告诉我们中间元素的下标,我们只需要递归调用者两侧。TreeNode *left=convertToBST(start,mid);//TreeNode *node = new TreeNode(this->head->val);node->left = left;this->head = this->head->next;//递归完左半部分,链表中的head指针将指向根节点或中间节点,TreeNode *right=convertToBST(mid+1,end);node->right = right;return node;
}TreeNode* sortedListToBST(ListNode* head) {this->head=head;int nsize = GetSize(this->head);TreeNode *tree =  convertToBST(0,nsize);return tree;
}

leetcode算法题--有序链表转换二叉搜索树★相关推荐

  1. 【算法】有序链表转换二叉搜索树和从中序与后序遍历序列构造二叉树Java解答参考

    三道算法题 1.有序链表转换二叉搜索树 Java代码参考 2.从中序与后序遍历序列构造二叉树 Java代码参考 3.移除元素 Java代码参考 1.有序链表转换二叉搜索树 给定一个单链表,其中的元素按 ...

  2. ( “树” 之 BST) 109. 有序链表转换二叉搜索树 ——【Leetcode每日一题】

    二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点. 二叉查找树中序遍历有序. 109. 有序链表转换二叉搜索树 给定一个单链表的头节点 head ,其中的元素 按升序排序 , ...

  3. 【LeetCode每日一题】——109.有序链表转换二叉搜索树

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[题目提示] 七[解题思路] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 二叉树 二[题 ...

  4. Java实现 LeetCode 109 有序链表转换二叉搜索树

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

  5. 有序链表转换二叉搜索树

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

  6. 109. 有序链表转换二叉搜索树

    链接:109. 有序链表转换二叉搜索树 题解:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/so ...

  7. LeetCode 109. 有序链表转换二叉搜索树(快慢指针+递归)

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

  8. LeetCode(109):有序链表转换二叉搜索树

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

  9. [Leetcode][第109题][JAVA][有序链表转换二叉搜索树][分治][快慢指针][中序遍历]

    [问题描述][中等] [解答思路] 1. 分治 快慢指针 复杂度 class Solution {public TreeNode sortedListToBST(ListNode head) {ret ...

最新文章

  1. 夜间奇异规范:夜间高效自监督单目深度估计(ICCV 2021)
  2. 3.浏览器输入www.baidu.com到显示主页的全过程
  3. 关于string.Template的简单介绍
  4. linux配置redis服务,记一次linux下安装redis, 设置redis服务, 及添加环境变量
  5. 核弹级漏洞 Apache Log4j2 漏洞详情和修复建议
  6. jquery-手风琴效果
  7. Matlab求高斯脉冲函数
  8. 达“超人”水平?强化学习得这么用!
  9. 使用 Apache Hadoop 处理日志
  10. path和classpath的用途
  11. 民企信息化建设个人经历(一)
  12. 新疆职称英语和职称计算机,职称计算机考试题库
  13. 没有人能扼杀掉你的梦想
  14. 地网导通测试仪_江西地网接地导通测试仪特点
  15. 赴一场心仪已久的戴尔中国“家宴”
  16. 机械臂控制软件,上位机软件 此机器人上位软件。 运动采用通用G代码指令编程,具有G5三维的空间圆弧插补,空间直线插补功能
  17. 指针<小罗爱c语言>
  18. 哪个牌子的护眼台灯适合学生?国AA级照度的护眼台灯
  19. 打开网页被Java拦截怎么办_应用程序已被java安全阻止怎么办
  20. Python tkinter+文件操作 实现学生信息管理系统

热门文章

  1. python自学网站有哪些-分享干货:三个新手自学Python的网站!
  2. python入门视频教程推荐-Python入门视频看哪个好?适合初学者的教学视频推荐
  3. python将运行结果用窗口打开-如何打开新控制台并运行python脚本
  4. python变量类型-Python-变量类型
  5. python装饰器-装饰器
  6. 电脑无法安装python-无法安装Python库
  7. python常用命令大全-Python常用命令之集合
  8. python和c-在python和C之间进行通信
  9. linux下载哪个python版本-Linux下升级安装Python-3.6.2版本
  10. winston日志框架