Leetcode 刷题笔记1 二叉树part07

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

本题的关键在于如何利用二叉搜索树的性质简化普通二叉树搜索最近公共祖先的过程,如果

cur.val > p.val && cur.val < q.val 或者 cur.val < p.val && cur.val > q.val,即cur.val在区间[p, q]中。

递归法:
 

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

迭代法:
 

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

迭代法在这题显得格外通俗易懂

leetcode701 二叉搜索树中的插入操作

本题的重点在于理解二叉搜索树的插入操作,并不需要改变树的结构,在插入操作时,只需要在合适的空节点插入即可

递归法:

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

 leetcode450 删除二叉树中的节点

相比于增加节点,删除二叉树的节点更为复杂,需要考虑的情况比较多,左右为空、左空右不空、左不空右空、左右都不空还有没找到删除的节点。其中需要注意的是左右都不用的情况比较复杂。

递归法:

class Solution:
    def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
        if not root:
            return root
        if root.val == key:
            if root.left is None and root.right is None:
                return None
            if root.left and root.right is None:
                return root.left
            if root.right and root.left is None:
                return root.right
            # 最难理解的部分
            if root.right and root.left:
                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、付费专栏及课程。

余额充值