今日leetcode 三题:
530.二叉搜索树的最小绝对差
501.二叉搜索树中的众数
236. 二叉树的最近公共祖先 算法题
小结:
- 简单题,思路要通畅,有好的代码书写风格,写题快
- 关于dict: for key,value in dict.items() #记住是 dict.items()
- 简单题直接撕;中等题先有思路再思考是否周全再撕;难题,搭好框架,争取解决部分情景
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。