刷题神器
往期回顾
>【二叉树】|代码随想录算法训练营第16天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
题目
235. 二叉搜索树的最近公共祖先
-
学后思路
配合二叉搜索树的特性寻找公共祖先
解法1:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null) return root;
if(p.val<root.val && q.val< root.val){
TreeNode left = lowestCommonAncestor(root.left, p, q);
if(left != null) return left;
}
if(p.val>root.val && q.val> root.val){
TreeNode right = lowestCommonAncestor(root.right, p, q);
if(right!= null) return right;
}
return root;
}
}
- 题目总结
- 注意当 root 再pq中间的时候,root就是最小公共祖先
701.二叉搜索树中的插入操作
- 学后思路
二叉搜索树的插入,全部都在叶子节点完成,不是平衡二叉树,无需进行平衡操作
解法一:
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
if (root == null) {
return new TreeNode(val);
}
if (root.val > val) {
root.left = insertIntoBST(root.left, val);
}
if (root.val < val) {
root.right = insertIntoBST(root.right, val);
}
return root;
}
}
- 题目总结
- 注意左右递归的条件是val要大于或者小于root.val
450.删除二叉搜索树中的节点
- 学后思路
找到要删除的节点,操作对应的节点,根据不同的条件进行判断
解法一:
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if (root == null)
return root;
if (root.val == key) {
if (root.left == null && root.right == null) {
return null;
} else if (root.left != null && root.right == null) {
return root.left;
} else if (root.left == null && root.right != null) {
return root.right;
} else {
TreeNode cur = root.right;
while (cur.left != null) {
cur = cur.left;
}
cur.left = root.left;
return root.right;
}
}
if (root.val > key) {
root.left = deleteNode(root.left, key);
}
if (root.val < key) {
root.right = deleteNode(root.right, key);
}
return root;
}
}
- 题目总结
- 删除节点,找到节点的时候做动作
- 注意删除左右都有的节点,需要找到右边最小的节点