leetcode算法题--有序链表转换二叉搜索树★
原题链接: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算法题--有序链表转换二叉搜索树★相关推荐
- 【算法】有序链表转换二叉搜索树和从中序与后序遍历序列构造二叉树Java解答参考
三道算法题 1.有序链表转换二叉搜索树 Java代码参考 2.从中序与后序遍历序列构造二叉树 Java代码参考 3.移除元素 Java代码参考 1.有序链表转换二叉搜索树 给定一个单链表,其中的元素按 ...
- ( “树” 之 BST) 109. 有序链表转换二叉搜索树 ——【Leetcode每日一题】
二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点. 二叉查找树中序遍历有序. 109. 有序链表转换二叉搜索树 给定一个单链表的头节点 head ,其中的元素 按升序排序 , ...
- 【LeetCode每日一题】——109.有序链表转换二叉搜索树
文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[题目提示] 七[解题思路] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 二叉树 二[题 ...
- Java实现 LeetCode 109 有序链表转换二叉搜索树
109. 有序链表转换二叉搜索树 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. ...
- 有序链表转换二叉搜索树
109. 有序链表转换二叉搜索树 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. ...
- 109. 有序链表转换二叉搜索树
链接:109. 有序链表转换二叉搜索树 题解:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/so ...
- LeetCode 109. 有序链表转换二叉搜索树(快慢指针+递归)
1. 题目 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 来源:力扣(LeetC ...
- LeetCode(109):有序链表转换二叉搜索树
Medium! 题目描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: ...
- [Leetcode][第109题][JAVA][有序链表转换二叉搜索树][分治][快慢指针][中序遍历]
[问题描述][中等] [解答思路] 1. 分治 快慢指针 复杂度 class Solution {public TreeNode sortedListToBST(ListNode head) {ret ...
最新文章
- 夜间奇异规范:夜间高效自监督单目深度估计(ICCV 2021)
- 3.浏览器输入www.baidu.com到显示主页的全过程
- 关于string.Template的简单介绍
- linux配置redis服务,记一次linux下安装redis, 设置redis服务, 及添加环境变量
- 核弹级漏洞 Apache Log4j2 漏洞详情和修复建议
- jquery-手风琴效果
- Matlab求高斯脉冲函数
- 达“超人”水平?强化学习得这么用!
- 使用 Apache Hadoop 处理日志
- path和classpath的用途
- 民企信息化建设个人经历(一)
- 新疆职称英语和职称计算机,职称计算机考试题库
- 没有人能扼杀掉你的梦想
- 地网导通测试仪_江西地网接地导通测试仪特点
- 赴一场心仪已久的戴尔中国“家宴”
- 机械臂控制软件,上位机软件 此机器人上位软件。 运动采用通用G代码指令编程,具有G5三维的空间圆弧插补,空间直线插补功能
- 指针<小罗爱c语言>
- 哪个牌子的护眼台灯适合学生?国AA级照度的护眼台灯
- 打开网页被Java拦截怎么办_应用程序已被java安全阻止怎么办
- Python tkinter+文件操作 实现学生信息管理系统