代码随想录第二十天| 235. 二叉搜索树的最近公共祖先 、 701.二叉搜索树中的插入操作、 450.删除二叉搜索树中的节点

235. 二叉搜索树的最近公共祖先

题目描述

给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。

在百度百科中,最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

解题思路

  1. 二叉搜索树的性质

    • 左子树的所有节点值小于根节点值;
    • 右子树的所有节点值大于根节点值;
    • 如果节点 p 和 q 的值分别位于当前节点值的两侧,则当前节点即为最近公共祖先。
  2. 方法一:迭代法

    • 从根节点开始遍历;
    • 根据节点 p 和 q 的值判断向左子树还是右子树继续遍历;
    • 如果当前节点值在 p 和 q 的值之间(包含等于),当前节点即为最近公共祖先。
  3. 方法二:递归法

    • 从根节点递归判断;
    • 如果 p 和 q 的值都小于当前节点值,递归查找左子树;
    • 如果 p 和 q 的值都大于当前节点值,递归查找右子树;
    • 否则当前节点为最近公共祖先。

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null){
			return null;
		}
		TreeNode node = root;
		while(node!=null){
			if(node.val > p.val && node.val > q.val){
				node = node.left;
			} else if (node.val < p.val && node.val < q.val) {
				node = node.right;
			}else{
				return node;
			}
		}
		return null;
    }
}
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
		if(root.val > p.val && root.val > q.val) {
			root = lowestCommonAncestor(root.left, p, q);
		}else if (root.val < p.val && root.val < q.val){
			root = lowestCommonAncestor(root.right, p, q);
		}

		return root;
    }
}

235. 二叉搜索树的最近公共祖先

题目描述

给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。

在百度百科中,最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

解题思路

  1. 二叉搜索树的性质

    • 左子树的所有节点值小于根节点值;
    • 右子树的所有节点值大于根节点值;
    • 如果节点 p 和 q 的值分别位于当前节点值的两侧,则当前节点即为最近公共祖先。
  2. 方法一:迭代法

    • 从根节点开始遍历;
    • 根据节点 p 和 q 的值判断向左子树还是右子树继续遍历;
    • 如果当前节点值在 p 和 q 的值之间(包含等于),当前节点即为最近公共祖先。
  3. 方法二:递归法

    • 从根节点递归判断;
    • 如果 p 和 q 的值都小于当前节点值,递归查找左子树;
    • 如果 p 和 q 的值都大于当前节点值,递归查找右子树;
    • 否则当前节点为最近公共祖先。

class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
		TreeNode node = new TreeNode(val);
        if(root==null){
			root = node;
			return node;
		}
		if(root.val>val){
			root.left = insertIntoBST(root.left,val);
		}else {
			root.right = insertIntoBST(root.right,val);
		}
		return root;

    }
}
class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
		TreeNode node = new TreeNode(val);
        if(root==null){
			root = node;
			return node;
		}
		TreeNode newroot = root;
		TreeNode pre = root;
		while(root!=null){
			pre = root;
			if(root.val>val){
				root = root.left;
			} else {
				root = root.right;
			}
		}
		if(pre.val>val){
			pre.left = node;
		}else {
			pre.right = node;
		}
		return newroot;

    }
}

markdown
复制代码

450. 删除二叉搜索树中的节点

题目描述

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

  1. 首先找到需要删除的节点;
  2. 如果找到了,删除它。

要求:算法时间复杂度为 O(h)O(h)O(h),其中 hhh 为树的高度。

解题思路

  1. 查找节点

    • 根据二叉搜索树的性质:若 key < root.val,在左子树查找;若 key > root.val,在右子树查找。
  2. 删除节点的三种情况

    • 叶子节点:直接删除,返回 null
    • 只有一个子节点:用该节点的唯一子节点替代它。
    • 有两个子节点:找到右子树的最小节点(后继节点),将该节点的值替代当前节点的值,然后删除后继节点。

代码

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root == null){
			return null;
		}
		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 if(root.left != null && root.right != null){
				TreeNode node = root.right;
				while(node.left != null){
					node=node.left;
				}
				node.left = root.left;
				return root.right;
			}

		}
		root.left = deleteNode(root.left,key);
		root.right = deleteNode(root.right,key);
		return root;
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值