训练营刷题_day18_python

今日leetcode 三题:
530.二叉搜索树的最小绝对差
501.二叉搜索树中的众数
236. 二叉树的最近公共祖先 算法题

小结:

  1. 简单题,思路要通畅,有好的代码书写风格,写题快
  2. 关于dict: for key,value in dict.items() #记住是 dict.items()
  3. 简单题直接撕;中等题先有思路再思考是否周全再撕;难题,搭好框架,争取解决部分情景
530.二叉搜索树的最小绝对差
写之前又没注意审题,人家时二叉搜索树,存在左(子树)根右(子树)越来越大的原则,没必要任意两个节点计算,只计算两层之间的节点就行。 下面是是转了list做的,emm,繁琐的感觉。

在这里插入图片描述

501.二叉搜索树中的众数
简单题,dict ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/72bffcabdb994d95b4182d1a0fa502cd.png)
236. 二叉树的最近公共祖先

下面为错误示范!

  • 1.算法转代码的功力还得加强
  • 2.要有好的学习习惯,在性价比最高的地方花时间。题解/kimi给了好的代码,就直接学,不要在原有的不太规范的基础上死犟
  • 3.对nonlocal 的掌握加强,变量在函数体内用,不需要nonlocal,哪怕是递归里面返回值如ans,但如ans_node,在函数体外定义的或者在函数结束后还需要使用的,需要nonlocal
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        def digui(node):
            nonlocal ans_node
            if not node:
                return 0
            ans = digui(node.left) + digui(node.right)
            if ans == 2:
                if node.left.val!= p.val and node.left.val!=q.val:
                    ans_node = node.right.val
                elif node.right.val!=p.val and node.right.val!=q.val:
                    ans_node = node.left.val
                else:
                    ans_node = node.val
                ans = 4
            if node.val == p.val or node.val == q.val:
                ans+= 1

            return ans

        ans = 0
        ans_node = root.val
        digui(root)
        return TreeNode(ans_node)

该题算法巧妙:
算法:

根据左右子树的探索结果,确定当前节点是否为最近公共祖先:

  • 如果左子树和右子树的返回结果都不为空(即左子树找到了p,右子树找到了q,或者反过来),这说明当前节点是p和q的最近公共祖先。
  • 如果只有一个子树的返回结果不为空,表示两个节点都在这一侧的子树中,那么返回那个非空的子树结果。
  • 如果两个子树的返回结果都为空,说明当前节点下不存在p或q,返回None。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值