算法训练营day21 | {235.二叉搜索树的最近公共祖先, 701.二叉搜索树中的插入操作, 450.删除二叉搜索树中的节点}
第六章二叉树part07,找二叉搜索树的最近公共祖先原来是前序遍历。
235. 二叉搜索树的最近公共祖先
- 题目链接:235. 二叉搜索树的最近公共祖先
- 文档讲解:代码随想录–235. 二叉搜索树的最近公共祖先
- 视频讲解:二叉搜索树找祖先就有点不一样了!| 235. 二叉搜索树的最近公共祖先
- 状态:左子树节点的值一定小于根节点的值,根节点的值又一定比右子树节点的值小。
1.1 递归法
本题其实和在一个二叉搜索树中查找指定的值思路一样,也适合用前序遍历,当发现一个节点刚好在节点p和节点q时,它必定是两节点的公共祖先,同时也是最近祖先。
分析递归三步曲:
- 参数和返回值是什么? 要传入一个根节点,指定的节点p、节点q;返回值是找到的祖先节点
- 确定递归的终止条件。 如果当前节点为空节点,则返回。
- 确定单层递归的逻辑。 前序遍历,中左右,很简单的比较吧~
前序遍历–递归
▶235. 二叉搜索树的最近公共祖先1
2
3
4
5
6
7
8class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) return null;
if(Math.min(p.val, q.val) <= root.val && root.val <= Math.max(p.val, q.val)) return root;
else if (Math.max(p.val, q.val) < root.val) return lowestCommonAncestor(root.left, p, q);
return lowestCommonAncestor(root.right, p, q);
}
}
1.2 迭代法
▶
235. 二叉搜索树的最近公共祖先1 | |
701.二叉搜索树中的插入操作
- 题目链接:701.二叉搜索树中的插入操作
- 文档讲解:代码随想录–701.二叉搜索树中的插入操作
- 视频讲解:原来这么简单? | LeetCode:701.二叉搜索树中的插入操作
- 状态:这题用迭代法最简单。因为不是平衡二叉树,不用保持高度绝对值差的性质,直接找叶子节点就好了。
2.1 解题分析
- 迭代法▶701.二叉搜索树中的插入操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
TreeNode cur = root, pre = null;
while (cur != null) {
pre = cur;
if (val < cur.val) cur = cur.left;
else cur = cur.right;
}
if (pre == null) return new TreeNode(val);
else if (pre.val > val) pre.left = new TreeNode(val);
else pre.right = new TreeNode(val);
return root;
}
}
450. 删除二叉搜索树中的节点
- 题目链接:450.删除二叉搜索树中的节点
- 文档讲解:代码随想录–450.删除二叉搜索树中的节点
- 视频讲解:调整二叉树的结构最难!| LeetCode:450.删除二叉搜索树中的节点
- 状态:考研过的思路都会吧,先查找树中是否存在给定要删除的key节点,如果是叶子节点,直接删除,如果是非叶子节点,为保持特性还要分情况讨论一下。
3.1 解题分析
遍历只要保证左右就可以了,前序遍历
本题不需要遍历整个树,找到要删除的节点删除后就终止了,以下是终止情况的讨论:
- 没找到要删除的key节点
- 要删除的节点是叶子节点
- 要删除的节点 左不空,右空
- 要删除的节点 左空,右不空
- 要删除的节点 左不空,右也不空
▶
450. 删除二叉搜索树中的节点1 | |
注意左不空,右也不空时,还是和平衡二叉树的删除不太一样的,那个还要中序遍历找最近的节点,并且左旋右旋。本题比较暴力,不过题不要做复杂了。
5. 今日收获
- 继续二叉搜索树的练习,多思考、多利用二叉搜索树的特性解题。
- 学习时长:2小时
算法训练营day21 | {235.二叉搜索树的最近公共祖先, 701.二叉搜索树中的插入操作, 450.删除二叉搜索树中的节点}
http://paopaotangzu.xyz/cn/day21_leetcode/