1. 修剪二叉搜索树

LeetCode569. 力扣

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。

所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

图1. 修剪二叉搜索树示例

分析:

(1)对于当前节点的值:

如果当前的节点<下界,那么,看该节点的右子树(看比较大的一边);若当前节点>上界,那么,看该节点的左子树(看比较小的一边);

(2)对当前节点的左右子树:

如果当前节点的右节点>上界,看右节点的左子树是否满足上界条件(小于上界),若满足,则将当前节点的右指针指向右节点的左子树;

如果当前节点的左节点<下界,看左节点的右子树是否满足下界条件(大于下界),若满足,则将当前节点的左指针指向左节点的右子树。

每一个节点都是如此,因此结构为递归结构。

2. 将有序数组转化为二叉搜索树

LeetCode108. 力扣

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

图2. 将有序数组转化为二叉搜索树

分析,以数组[-10, -3, 0, 5, 9]为例,

首先,为了保障二叉搜索树为一个平衡树,那么,左右子树的节点个数必须保证不能相差太大,因此,选取的根节点为中间的节点,索引为i = int(len(nums)/2)

(1)若 i 不是最后一个元素,则其右子树为:

nums[i+1 : ]

构造平衡二叉搜索树的方式同理;

(2)若 i 不是第一个元素,则其左子树为:

nums[ : i]

构造平衡二叉搜素树的方式同理。

由该分析知,构造该平衡二叉搜素树的算法为递归结构。

3. 代码

# Definition for a binary tree node.
class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef set_left(self, left):self.left = leftdef set_right(self, right):self.right = rightclass Solution(object):def trimBST(self, root, low, high):""":type root: TreeNode:type low: int:type high: int:rtype: TreeNode"""current = rootif current.val < low:if current.right != None:return self.trimBST(current.right, low, high)else:return Noneelif current.val > high:if current.left != None:return self.trimBST(current.left, low, high)else:return Noneif current.left != None:if current.left.val < low:if current.left.right != None:current.left = self.trimBST(current.left.right, low, high)else:current.left = Noneelse:current.left = self.trimBST(current.left, low, high)if current.right != None:if current.right.val > high:if current.right.left != None:current.right = self.trimBST(current.right.left, low, high)else:current.right = Noneelse:current.right = self.trimBST(current.right, low, high)return rootdef sortedArrayToBST(self, nums):""":type nums: List[int]:rtype: TreeNode"""i = int(len(nums)/2)root = TreeNode(nums[i])if i == len(nums)-1:root.right = Noneelse:root.right = self.sortedArrayToBST(nums[i+1:])if i == 0:root.left = Noneelse:root.left = self.sortedArrayToBST(nums[:i])return root

LeetCode,二叉搜素树相关推荐

  1. LeetCode 98验证二叉搜素树(中序遍历)99恢复二叉搜索树

    微信搜一搜:bigsai 大家都在关注的刷题.学习数据结构和算法宝藏项目 关注回复进群即可加入力扣打卡群,欢迎划水.近期打卡: LeetCode 92反转链表Ⅱ&93复制ip地址&94 ...

  2. 《剑指offer》-- 从上往下打印二叉树、二叉搜素树的后序遍历、二叉树中和为某一值的路径、二叉树与双向链表

    一.从上往下打印二叉树: 1.题目: 上往下打印出二叉树的每个节点,同层节点从左至右打印. 2.解题思路: 用arraylist模拟一个队列来存储相应的TreeNode. 3.代码实现: public ...

  3. 掉一根头发,搞定二叉排序(搜索)树

    文章已收录在 数据结构与算法学习仓库 前言 前面介绍学习的大多是线性表相关的内容,把指针搞懂后其实也没有什么难度,规则相对是简单的,后面会讲解一些比较常见的数据结构,用多图的方式让大家更容易吸收. 在 ...

  4. 数据结构与算法—二叉排序(查找)树

    目录 前言 树 二叉树 二叉排序(搜索)树 概念 构造 主要方法 findmax(),findmin() isContains(int x) insert(int x) delete(int x) 完 ...

  5. 数据结构---二叉平衡排序树的删除

    数据结构-二叉平衡排序树的删除 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> typedef struct avlT ...

  6. 二叉平衡树(AVL树)详细理解

    二叉平衡树(AVL树) AVL树插入元素结论 单旋转: 双旋转: 如果看到后面会发现,我下面举得列子,类型一和类型三和我结论里面的有点不一样,那是因为类型一的节点4和类型三的节点14无论以何种方式都能 ...

  7. 14.曲面消隐——图像空间算法(Z-buffer)+对象空间算法(画家算法+二叉空间剖分树)

    ♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥ ...

  8. 数据结构与算法——二叉平衡树(AVL树)详解

    文章目录 AVL树概念 不平衡概况 四种平衡旋转方式 RR平衡旋转(左单旋转) LL平衡旋转(右单旋转) RL平衡旋转(先右后左双旋转) LR平衡旋转(先左后右单旋转) java代码实现 总结 AVL ...

  9. 详解 二叉搜索树-----AVL树

    二叉搜索树 根结点比左子树中所有结点都大 根结点比右子树所有结点都小 最小的元素在最左侧 最大的元素在最右侧 中序遍历有序 具有以上的特征的二叉树就是二叉搜索树也叫二叉排序数 二叉搜索树的操作 查找 ...

最新文章

  1. c mysql批量插入优化_MySQL实现批量插入以优化性能的教程
  2. 【Linux】27.Markdown的用法
  3. error C2872: “IDocument”: 不明确的符号
  4. 与老外交谈的常用句子
  5. SVN安装和使用总结
  6. 机器学习常用的算法整理:线性回归、逻辑回归、贝叶斯分类、支持向量机、K-means聚类、决策树、随机森林以及常用的应用场景整理
  7. erp采购总监个人总结_erp采购总监总结.docx
  8. mysql linux导入csv主键,MySQL导入csv文件内容到Table及数据库的自增主键设置
  9. 【XML】Java对象数据的XML和JSON表示
  10. 程序代码移植和烧录需要注意什么_法人变更需要注意什么
  11. 壁纸网站的高清图片,完美符合视觉控的你!
  12. SpringBoot连接Redis服务出现Command timed out
  13. DataList控件嵌套,激发内部控件事件
  14. 佩服Google敏锐和创意!人肉搜索引擎志愿者招募
  15. docker修改容器ip范围
  16. 朋友去面试阿里蚂蚁金服测试岗位过程经历
  17. python编译器哪个最好用_python编写器哪个好用?
  18. 以讹传讹的小故事大道理
  19. VBA-自动筛选符合条件的数据
  20. 苹果手机微信声音小怎么调大声_今天才知道,微信语音隐藏的3个功能,太实用了,看完涨知识了...

热门文章

  1. mac上git clone报错:error: RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (e
  2. 记AAMAS评审意见
  3. 如何玩转最近爆火的ChatGPT
  4. 解决win7报计算机内存不足的问题
  5. 史上最全 | 单目相机测距测速方法大盘点!
  6. 三角形面积外接圆内切圆
  7. Linux运维发展如何?哪家培训机构质量高?
  8. 数据蒋堂 | 中国报表漫谈
  9. 因为看淡,所以快乐,因为看清所以释然,多一点淡然;多一点豁达;
  10. 1.直角三角形的判定