代码随想录算法训练营第二十二天| 二叉树part08

235. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5]

 

 有了昨天练习的教训这道题应该问题就不大了,确定终止条件:如果root为空返回空,如果找到了p或者q返回root,递归左右搜索,使用后续遍历即可:

然后看视频学习:

二叉搜索树找祖先就有点不一样了!| 235. 二叉搜索树的最近公共祖先_哔哩哔哩_bilibili 

然后发现由于二叉搜索树的特性,如果结点的值比p q 大则p q一定在左子树,反之则是右子树,这样就好写,先写迭代法试试:

 然后也同样可以使用递归来解决:

 

701. 二叉搜索树中的插入操作

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。

第一次写二叉搜索树的插入,有了前题的经验,我认为可以使用迭代法的方式插入比较清晰,比较插入节点值和当前节点的大小分情况讨论就可以了:

 然后看看视频学习一下递归方法:

原来这么简单? | LeetCode:701.二叉搜索树中的插入操作_哔哩哔哩_bilibili

递归的逻辑也很简单,如果root为空说明找到插入的地方了,初始化节点返回。这里有点让人懵的就是返回的节点怎么被接住,所以递归函数需要一个root.left 或者root.right来接住,这里是我之前没有搞懂的地方。

 

450. 删除二叉搜索树中的节点

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

  1. 首先找到需要删除的节点;
  2. 如果找到了,删除它。

这道题感觉比上题难太多了,难点主要在重构二叉树上: 

调整二叉树的结构最难!| LeetCode:450.删除二叉搜索树中的节点_哔哩哔哩_bilibili 

看完以后豁然开朗:只要分情况讨论就非常清晰了,本题难就难在五种情况

1 没有val值 返回空

2 目标节点是叶子节点 返回空

2 目标节点左空右不空 返回左孩子

3 目标节点右空左不空 返回右孩子

4  左右孩子都不为空,这里最复杂,将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值