[Leetcode] Convert sorted list to binary search tree 将排好的链表转成二叉搜索树
---恢复内容开始---
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
题目要求:转成高度平衡的二叉搜索树。
高度平衡的二叉搜索树:i)左子树和右子树的高度之差的绝对值不超过1; ii)树中的每个左子树和右子树都是AVL树; iii)每个节点都有一个平衡因子(balance factor bf),任一节点的平衡因子是1,0,-1.(每个节点的平衡因子等于右子树的高度减去左子树的高度) .
方法一:使用快慢指针
思路:若是一升序的数组,则取中间元素,作为根节点,然后以此方法分别去构成处左右子树。但链表没有办法直接访问其中间的结点,怎么办?可以通过快慢指针的方式,当快指针到链表结尾时,慢指针刚好到链表的中间来实现找到中间结点的目的。然后用递归的方法构造树。代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *sortedListToBST(ListNode *head)
{
if(head==NULL) return NULL;
if(head->next==NULL) return new TreeNode(head->val); ListNode *fast=head;
ListNode *slow=head;
ListNode *preSlow=NULL; while(fast&&fast->next)
{
preSlow=slow;
slow=slow->next;
fast=fast->next->next;
} TreeNode *root=new TreeNode(slow->val);
preSlow->next=NULL;
root->left=sortedListToBST(head);
root->right=sortedListToBST(slow->next); return root; }
};
代码中值得注意的:一、只有一个结点时返回值的写法;二、使用快慢指针时,前半段要比后半段多;三、链表分成两条时,注意在结尾压入NULL,形成两条。
方法二:使用结点的个数一分为二
可以按照类似中序遍历的做法,首先,创建当前节点的左孩子,然后创建当前节点,将该节点的left指针指向之前创建好的左孩子,然后创建右孩子,以这样的顺序,每次新创建的节点都对应单链表的顺序遍历中当前位置的节点,因此,用一个全局遍历表示当链表,在递归过程中不断修改当前单链表的指针,使每次创建的节点与单链表头节点对应。这里的start和end使用来作为终止条件
class Solution {
public:
TreeNode *sortedListToBST(ListNode *head)
{
int len=;
ListNode *node=head;
while(node !=NULL)
{
node=node->next;
len++;
}
return rebuildBST(head,,len-);
}
TreeNode *rebuildBST(ListNode *&node,int start,int end)
{
if(start>end) return NULL;
//防止内存泄漏 mid=start+(end-start)/2;但是测试{1,3}(为偶数)用例通不过
int mid=(start+end+)>>;
TreeNode *leftChild=rebuildBST(node,start,mid-);
TreeNode *parent=new TreeNode(node->val);
parent->left=leftChild;
node=node->next;
parent->right=rebuildBST(node,mid+,end);
return parent;
}
};
[Leetcode] Convert sorted list to binary search tree 将排好的链表转成二叉搜索树的更多相关文章
- LeetCode:Convert Sorted Array to Binary Search Tree,Convert Sorted List to Binary Search Tree
LeetCode:Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in asce ...
- Leetcode: Convert sorted list to binary search tree (No. 109)
Sept. 22, 2015 学一道算法题, 经常回顾一下. 第二次重温, 决定增加一些图片, 帮助自己记忆. 在网上找他人的资料, 不如自己动手. 把从底向上树的算法搞通俗一些. 先做一个例子: 9 ...
- [LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- [LeetCode] Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树
Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 这道 ...
- leetcode -- Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- LeetCode: Convert Sorted List to Binary Search Tree 解题报告
Convert Sorted List to Binary Search Tree Given a singly linked list where elements are sorted in as ...
- LeetCode: Convert Sorted Array to Binary Search Tree 解题报告
Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...
- LeetCode——Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- [leetcode]Convert Sorted List to Binary Search Tree @ Python
原题地址:http://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ 题意:将一条排序好的链表转换为二叉查找树 ...
随机推荐
- JS高级. 01 复习JS基础
1. JavaScript 包含: ____, ____, 和 ____. 2. JavaScript 的基本类型有 ____, ____, 和 ____. 3. JavaScript 的复合类型有 ...
- php将html页面截图并保存成图片
采用html5的canvas,将图片绘制到画布上,然后用canvas的 toDataURL 方法. 但是在图片转base64的过程中遇到了两个问题, 1:图片无法绘制,转成的base64 用浏览器打开 ...
- Windows使用Node.js自动生成Vue.js模版环境部署步骤-----记录
node.js官网下载并安装node 进入node文档目录下,运行cmd 输入 node -v 查看node版本 出现表示安装完成 输入 npm -v 显示npm版本信息 安装cnpm 输入 npm ...
- ruby中将数字转化为字符串格式时差
工作中有时候会碰到需要把数值展示成比较直观的时间差格式,divmod方法很适合做这个操作. divmod #输出商和余数的数组 60.divmod(50) #=> [1, 10 ...
- ruby Encoding
一. 查看ruby支持的编码 Encoding.name_list 二. 搜索编码 Encoding.find('US-ASCII') #=> US-ASCII,不存在则抛出异常 三. __EN ...
- python,函数式编程
函数式编程: 特点:允许传递的参数是函数,且允许返回一个函数. 由于Python允许使用变量,因此,Python不是纯函数式编程语言,同样的输入可能输出不同,有副作用.纯函数式编程语言没有变量,输入和 ...
- stm8编程tips(stvd)
编译完成时显示程序占用的flash和ram大小 将附件压缩包中的mapinfo.exe解压到stvd的安装路径\stvd中 在工程上点右键选settings 右侧的选项卡选择Linker,将categ ...
- oracle 开启归档日志模式
摘自:https://www.jianshu.com/p/f8c0e9309ce2 在默认情况下,oracle数据库是在非归日志档模式中创建的,在非归档日志模式中,进行日志切换时会直接重写redo l ...
- 云计算之路-阿里云上:受够了OCS,改用ECS+Couchbase跑缓存
当今天早上在日志中发现这样的错误之后,对阿里云OCS(mecached缓存服务)的积怨倾泻而出. 2014-06-08 07:15:56,078 [ERROR] Enyim.Caching.Memca ...
- JDBC剖析篇(1):java中的Class.forName()
一.Class.forName() 在Java中我们一般用下面这样的语句来连接数据库(以MySQL为例) Class.forName("com.mysql.jdbc.Driver" ...