代码随想录Day22 二叉树Ⅷ

文章讲述了如何在给定的二叉搜索树中执行三个操作:1)找到两个指定节点的最近公共祖先;2)向BST中插入一个新值;3)删除具有特定值的节点,同时保持BST性质。提供了Python代码示例。
摘要由CSDN通过智能技术生成

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

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

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

例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5]

Python:往下遍历,寻找第一个在两个节点的值之间[p.val, q.val] 的节点

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if not root:
            return
        cur = root
        while cur:
            if cur.val > q.val and cur.val > p.val:
                cur = cur.left

            elif cur.val < q.val and cur.val < p.val:
                cur = cur.right

            else:
                return cur
        
        return None

701. 二叉搜索树中的插入操作

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。

Python: 按照二叉树搜索的方法,找到插入的位置,直接插入即可

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        if not root:
            return TreeNode(val=val)
        cur = root
        while cur:
            if cur.val > val:
                if cur.left is None:
                    cur.left = TreeNode(val=val)
                    return root
                else:
                    cur = cur.left

            else:
                if cur.right is None:
                    cur.right = TreeNode(val=val)
                    return root
                else:
                    cur = cur.right

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

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

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

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

Python:根据待删除节点的不同情况进行不同处理

  1. 如果没有找到待删除节点,直接返回根节点
  2. 如果待删除节点没有子节点,直接删除该节点
  3. 如果待删除节点只有左孩子,删除节点,左孩子补位
  4. 如果待删除节点只有右孩子,删除节点,右孩子补位
  5. 如果待删除结点有左右孩子,右孩子补位,左孩子成为右子树最左节点的左孩子
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
        if not root:
            return None

        if root.val == key:
            if not root.left and not root.right:
                return None
            
            elif not root.left :
                return root.right
            
            elif not root.right:
                return root.left

            else:
                cur = root.right
                while cur.left:
                    cur = cur.left

                cur.left = root.left
                return root.right

        
        
        if root.val > key:
            root.left = self.deleteNode(root.left,key)
        if root.val < key:
            root.right = self.deleteNode(root.right, key)

        return root

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值