每天一道Rust-LeetCode(2019-06-02) 有序链表转换二叉搜索树

坚持每天一道题,刷题学习Rust.

原题

题目描述

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

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

示例:

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

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

  0
/ \

-3 9

/ /

-10 5

解题过程

这是一个递归求解问题:

首先把链表从中间切开,那么这时候主体是一个相对平衡的二叉树

左边,右边分别像第一步一样递归求解即可.

impl Solution {
pub fn sorted_list_to_bst(head: Option<Box<ListNode>>) -> Option<Rc<RefCell<TreeNode>>> {
let v = Solution::list_to_vec(head);
let nodes = v.as_slice();
Solution::build_tree(nodes)
}
fn build_tree(nodes: &[i32]) -> Option<Rc<RefCell<TreeNode>>> {
if nodes.len() == 0 {
return None;
}
let left = nodes.len() / 2;
let right = nodes.len() / 2 + 1;
let mut leftNode: Option<Rc<RefCell<TreeNode>>> = None;
let mut rightNode = None;
if left > 0 {
leftNode = Solution::build_tree(&nodes[0..left]);
}
if right <= nodes.len() - 1 {
rightNode = Solution::build_tree(&nodes[right..nodes.len()])
}
Some(Rc::new(RefCell::new(TreeNode {
val: nodes[nodes.len() / 2],
left: leftNode,
right: rightNode,
})))
}
fn list_to_vec(head: Option<Box<ListNode>>) -> Vec<i32> {
let mut rhead = head.as_ref();
let mut v = Vec::new();
while let Some(h) = rhead {
v.push(h.val);
rhead = h.next.as_ref();
}
v
}
} #[cfg(test)]
mod test {
use super::*;
use crate::share::build_list_node;
use crate::share::build_tree;
use crate::share::NULL;
#[test]
fn test_sorted_list_to_bst() {
let l1 = build_list_node(&vec![-10, -3, 0, 5, 9]);
let t = build_tree(&vec![0, -3, 9, -10, NULL, 5]);
// println!("t={:?}", t);
// println!("sorted={:?}", Solution::sorted_list_to_bst(l1));
assert_eq!(Solution::sorted_list_to_bst(l1), t); let l1 = build_list_node(&vec![3, 5, 8]);
let t = build_tree(&vec![5, 3, 8]);
// println!("t={:?}", t);
// println!("sorted={:?}", Solution::sorted_list_to_bst(l1));
assert_eq!(Solution::sorted_list_to_bst(l1), t);
}
}

一点感悟

Tree里虽然用到了Rc,RcCell等,但是这里并不需要直接使用,因为只是构建,并不试用.

RefCell定义

RefCell接口的定义

impl<T: ?Sized> RefCell<T> {

pub fn borrow(&self) -> Ref<T> { }
pub fn try_borrow(&self) -> Result<Ref<T>,BorrowError> {}
pub fn borrow_mut(&self) -> RefMut<T> { }
pub fn try_borrow_mut(&self) -> Result<RefMut<T>, BorrowMutError> { }
pub fn get_mut(&mut self) -> &mut T { }

如何选择Cell和RefCell?

如果你只需要整体性地存⼊、取出T,那么就选 Cell。如果你需要有个可读写指针指向这个T修改它,那么就选RefCell。

其他

欢迎关注我的github,本项目文章所有代码都可以找到.

每天一道Rust-LeetCode(2019-06-03)的更多相关文章

  1. 001-电脑操作规范-2019年03月.doc

    001-电脑操作规范-2019年03月.doc   本文作者:徐晓亮 BoAi 作者腾讯QQ号码:595076941   /////////////////////////////////////// ...

  2. android 1.6 launcher研究之自定义ViewGroup (转 2011.06.03(二)——— android 1.6 launcher研究之自定义ViewGroup )

    2011.06.03(2)——— android 1.6 launcher研究之自定义ViewGroup2011.06.03(2)——— android 1.6 launcher研究之自定义ViewG ...

  3. 黑洞有毛 or 黑洞无毛:4星|《环球科学》2019年03月号

    <环球科学>2019年03月号 高水平的科普杂志.本期我感兴趣的话题有: 1:65岁以上老年人是转发假新闻的主力: 2:人的面孔特征可以通过50个维度来定义: 3:华裔科学家发现人脑颞叶中 ...

  4. Tensorflow学习笔记2019.01.03

    tensorflow学习笔记: 3.2 Tensorflow中定义数据流图 张量知识矩阵的一个超集. 超集:如果一个集合S2中的每一个元素都在集合S1中,且集合S1中可能包含S2中没有的元素,则集合S ...

  5. BlackArch Linux 2019.06.01 宣布发布

    导读 BlackArch Linux是一个基于Arch Linux的发行版,专为渗透测试人员和安全研究人员设计,并包含大量渗透测试和安全实用程序,已宣布发布2019.06.01版本. BlackArc ...

  6. 【2019年03月29日】股票的滚动市盈率PE最低排名

    仅根据最新的市盈率计算公式进行排名,无法对未来的业绩做出预测. 深康佳A(SZ000016) - 滚动市盈率PE:2.51 - 滚动市净率PB:1.68 - 滚动年化股息收益率:2.9% - - - ...

  7. C++ 标准 和 C 标准 (截止到2019年03月)

    C++ 标准:维基百科 Year C++ Standard Informal name 1998 ISO/IEC 14882:1998[23] C++98 2003 ISO/IEC 14882:200 ...

  8. 2019.06.17课件:[洛谷P1310]表达式的值 题解

    P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...

  9. [LeetCode]LCP 06. 拿硬币

    桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中.我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数. 示例 1: 输入:[4,2,1] 输出:4 解释:第一堆力扣 ...

  10. JS中的prototype(原文地址:http://www.cnblogs.com/yjf512/archive/2011/06/03/2071914.html)

    JS中的phototype是JS中比较难理解的一个部分 本文基于下面几个知识点: 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个 ...

随机推荐

  1. mysql修改windows下的data目录

    在windows下,安装完mysql后,建议把数据目录(data目录)移动到非系统目录,避免系统出问题的时候还原. 1.在d盘创建一个mysqldata 2.给新文件增加权限NetworkServic ...

  2. [报名中] 腾讯技术专家为你揭秘"音视频及融合通信技术"

    | 导语 6月29日,北京东直门亚朵S酒店,云+社区邀您参加<音视频及融合通信技术>沙龙活动,深度探讨音视频及融合通信技术的发展及实践,领略前沿,共创价值. 数字多媒体技术的不断发展对音视 ...

  3. react 16 Hooks渲染流程

    useState react对useState进行了封装,调用了mountState. function useState<S>( initialState: (() => S) | ...

  4. enum一个最不像class的class

    enum一个最不像class的classjava枚举类型是jdk5出现的.它的出现主要为了解决一些有特殊意义,已经确定的,长度不会改变的集合. //月份描述 public class Month { ...

  5. Python【每日一问】38

    问: 基础题: 设计一个经营杠杆系数函数DOL,它包含三个参数,S为营业收入,C为变动成本总额,F为固定成本的总额. 已知2018年的S为20,C为11,F为3,求2019年的经营杠杆系数. 提高题: ...

  6. PyQt5笔记之菜单栏

    目录 菜单栏 创建单层菜单 创建多层菜单 右键打开菜单 官方菜单实例 菜单常用方法 菜单栏 创建单层菜单 import sys from PyQt5.QtWidgets import QApplica ...

  7. CentOS7 SUDO 笔记--没配置sudoer,为什么有的账号能用sudo命令,有的不能用

    原来: 一.安装linux 创建的用户(管理员打钩)默认在 wheel组里. 1. 使用 cat /etc/passwd 查看用户所在组.中间那个数字是 groupid 不太好看 2.使用 cat / ...

  8. linux中断子系统

    参考引用:http://www.wowotech.net/sort/irq_subsystem wowotech:一个很好的linux技术博客. 一.概述 目的 kernel管理硬件设备的方式:轮询. ...

  9. SSL保护 C/S 、B/S 通信安全

    转:https://blog.csdn.net/GitChat/article/details/78431275 网络安全是一个永恒的话题,保护网络安全有很多方法,其中应用最为广泛的就是使用 SSL ...

  10. 2019年12月的第一个bug

    现在是2019年12月1日0点27分,我的心情依旧难以平静.这个月是2019年的最后一个月,是21世纪10年代的最后一个月,也是第一批90后30岁以前的最后一个月.就是在这个月的第一天的0点0分,我写 ...