235.力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
return search(root,p,q);
}
public TreeNode search(TreeNode root, TreeNode p, TreeNode q){
if(root == null){
return null;
}
//都大于,说明在左子树
if(root.val > p.val && root.val > q.val)
return search(root.left,p,q);
//都小于,说明在右子树
if(root.val < p.val && root.val < q.val)
return search(root.right,p,q);
//都不是,返回root
return root;
}
}
701.力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
始终向叶子节点插入
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
return search(root,val);
}
public TreeNode search(TreeNode root, int val){
if(root == null){
return new TreeNode(val);
}
//root的值大于val,val向左子树递归
if(root.val > val){
root.left = search(root.left,val);
}else{
//root的值小于val,val向右子树递归
root.right = search(root.right,val);
}
return root;
}
}
450.删除叶子节点
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
// 如果根节点为空,直接返回空
if (root == null) return root;
// 如果找到了要删除的节点
if (root.val == key) {
// 如果要删除的节点没有左子树,则将右子树作为新的根节点
if (root.left == null) {
return root.right;
}
// 如果要删除的节点没有右子树,则将左子树作为新的根节点
else if (root.right == null) {
return root.left;
}
// 如果要删除的节点既有左子树又有右子树
else {
// 找到右子树中最左边的节点,即右子树中最小的节点
TreeNode cur = root.right;
while (cur.left != null) {
cur = cur.left;
}
// 将当前节点的左子树设置为要删除节点的左子树
cur.left = root.left;
// 将当前节点作为新的根节点
root = root.right;
return root;
}
}
// 如果要删除的节点值小于根节点的值,则递归处理左子树
if (root.val > key) root.left = deleteNode(root.left, key);
// 如果要删除的节点值大于根节点的值,则递归处理右子树
if (root.val < key) root.right = deleteNode(root.right, key);
return root;
}
}