给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 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一定在左子树,反之则是右子树,这样就好写,先写迭代法试试:
然后也同样可以使用递归来解决:
给定二叉搜索树(BST)的根节点 root
和要插入树中的值 value
,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
第一次写二叉搜索树的插入,有了前题的经验,我认为可以使用迭代法的方式插入比较清晰,比较插入节点值和当前节点的大小分情况讨论就可以了:
然后看看视频学习一下递归方法:
原来这么简单? | LeetCode:701.二叉搜索树中的插入操作_哔哩哔哩_bilibili
递归的逻辑也很简单,如果root为空说明找到插入的地方了,初始化节点返回。这里有点让人懵的就是返回的节点怎么被接住,所以递归函数需要一个root.left 或者root.right来接住,这里是我之前没有搞懂的地方。
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
这道题感觉比上题难太多了,难点主要在重构二叉树上:
调整二叉树的结构最难!| LeetCode:450.删除二叉搜索树中的节点_哔哩哔哩_bilibili
看完以后豁然开朗:只要分情况讨论就非常清晰了,本题难就难在五种情况
1 没有val值 返回空
2 目标节点是叶子节点 返回空
2 目标节点左空右不空 返回左孩子
3 目标节点右空左不空 返回右孩子
4 左右孩子都不为空,这里最复杂,将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。