代码随想录算法训练营第二十二期|235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作, 450.删除二叉搜索树中的节点

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

思路: 本题比直接找二叉树的最近公共祖先更容易, 可以利用二叉树的性质。 node 左边的值都小于node, node 右边的值都大于node。 指针从 root 开始, 如果两个值都小于node, 指针往左移动, 反之往右移动。 如果 node 的值恰好等于其中一个值,或者node值介于两个值中间, 输出该node。 

难点: 无

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        cur_node = root
        low = min(p.val, q.val)
        high = max(p.val, q.val)
        while cur_node:
            if cur_node.val == low or cur_node.val == high or (cur_node.val > low and cur_node.val < high):
                return cur_node
            elif cur_node.val < low:
                cur_node = cur_node.right
            else:
                cur_node = cur_node.left
        return cur_node

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

LeetCode - The World's Leading Online Programming Learning Platform

思路: 插入操作要简单一些, 利用二叉树的性质, 如果 node.val 大于 要插入的值, 就往node的左边探, 如果node.val 小于 要插入的值就往右边探。 如果 node 是空的了, 就返回一个新 node, 新node 的值等于node.val

难点: 判断迭代的时候返回的条件即可

class Solution:
    def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        if not root:
            return TreeNode(val)
        if root.val < val:
            root.right = self.insertIntoBST(root.right, val)
        else:
            root.left = self.insertIntoBST(root.left, val)
        return root

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

思路:删除元素的操作要复杂一点, 首先要找到元素。 然后如果这个元素是 root 的话, 就把 root 的左边元素全部放到右边的最左边, 并返回root.right,如果不是root, 就让 root.left = 删除元素后的 root.right, 或者 root.right = 删除元素后的 root.right

难点: 要改变Tree 的结构, 想好删除的node.left 放到哪里。

class Solution:
    def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
        if not root:
            return None
        if root.val > key:
            root.left = self.deleteNode(root.left, key)
        elif root.val < key:
            root.right = self.deleteNode(root.right, key)
        else:
            _tmp_node = root.left
            if not root.right:
                return _tmp_node
            else:
                cur_node = root.right
                while cur_node.left:
                    cur_node = cur_node.left
                cur_node.left = _tmp_node
                return root.right
        return root

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值