代码随想录Day19
题目列表
- 235.二叉搜索树的最近公共祖先(LeetCode)
- 701.二叉搜索树中的插入操作(LeetCode)
- 450.删除二叉搜索树中的节点(LeetCode)
解题过程
235.二叉搜索树的最近公共祖先
题目描述

解题思路
因为二叉搜索树的特性,第一时间想到迭代法,因为不用走回头路。两个二叉搜索树的节点的最近公共祖先有一个特点:祖先的 val 的大小位于 p 和 q 的 val 之间,根据这个特点不断向下遍历直到找到这个节点,这个节点一定是最近的祖先。
代码展示
//迭代法
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null) return null;
while(root != null){
if(root.val < p.val && root.val < q.val){
root = root.right;
}else if(root.val > p.val && root.val > q.val){
root = root.left;
}else{
return root;
}
}
return null;
}
}
701.二叉搜索树中的插入操作
题目描述

解题思路
在不考虑重构树的情况下,插入节点只需要遵守二叉搜索树特性即可,一定会找到一个节点,而这个待插入的节点就是它的左孩子或右孩子。
代码展示
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
if(root == null) return new TreeNode(val);
if(val > root.val) root.right = insertIntoBST(root.right, val);
if(val < root.val) root.left = insertIntoBST(root.left, val);
return root;
}
}
450.删除二叉搜索树中的节点
题目![]()
描述
解题思路
删除节点有五种情况:
- 该节点为 null
- 该节点为叶子节点
- 该节点左孩子不空右孩子空
- 该节点左孩子空右孩子不空
- 该节点左右孩子都不空
代码展示
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if(root == null) return root;
if(key > root.val){
root.right = deleteNode(root.right, key);
}else if(key < root.val){
root.left = deleteNode(root.left, key);
}else{
//包含是叶子节点的情况
if(root.left == null) return root.right;
if(root.right == null) return root.left;
TreeNode newRoot = root.right;
while(newRoot.left != null){
newRoot = newRoot.left;
}
newRoot.left = root.left;
return root.right;
}
return root;
}
}


浙公网安备 33010602011771号