leetcode 刷题第一周总结

先来看看第一周都刷了哪些题目吧!然后再来总结一下刷题

236. Lowest Common Ancestor of a Binary Tree

1644.Lowest Common Ancestor of a Binary Tree II

1650.Lowest Common Ancestor of a Binary Tree III

1676 Lowest Common Ancestor of a Binary Tree IV

235.  Lowest Common Ancestor of a Binary Search Tree

2096. Step-By-Step Directions From a Binary Tree Node to Another

1257. Smallest Common Region

257. Binary Tree Paths

1740. Find Distance in a Binary Tree

113.  Path Sum II

Maximum Average Subtree

1973 Count Nodes Equal to Sum of Descendants

508. Most Frequent Subtree Sum

572 Subtree of Another Tree

100. Same Tree

250 Count Univalue Subtrees

1. Two Sum

大部分的题目都是关于Binary Tree。

因为跟着九章算法的视频刷题,先学的就是树。

关于binary tree,一般的想法就是divide and conquer.

1 divide : 先把问题分解,二叉树就能把整个问题分解为先去处理左子树的相同问题。

然后处理右子树的相同问题。

2. conquer:把左右子树处理的结果进行合并处理。

比如lower common ancestor 的问题。

一. 这个就是典型的divide and conquer 解法。

     公共最小祖先,前提是要提供两个node,这样才能找到这两个node的公共祖先。比如P,Q的公共祖先。

     1. divide:
                先去找左子树中是否有P,Q这两个节点,然后去找右子树中是否有这P,Q两个节点。 

                如果找到任意节点,就返回找到的节点。

     2. conquer:
                合并的时候就会有三种情况。

                1. 当前root的左右子树都找到了要找的Q或者P,那最小祖先就是当前访问的root。

                    相当于两个富豪要认祖宗。某个名人比如秦桧的两个儿子,左儿子和右儿子分别得到消息自己的某某代儿孙就是富豪A和富豪B。 那么两个富豪的祖宗就是秦桧了。

                最小祖宗的确保办法是用递归从下往上遍历的属性。

                2. 左子树为空或者右子树为空。

                    这个问题得稍微考虑多一些。比如要找的这两个富豪,是不是在这个树中。

                    a) 这两个富豪肯定都是这个树的节点。

                          俩孙子都带着族谱,就差DNA检测报告了。 

                         从根往叶子递归调用的过程中。如果有一个路径上找到了一个富豪名字,并且其他的路径上都没有找到另外一个富豪名字。那肯定能说明这个富豪是另外一个富豪的最小祖宗了。

                    b) 这两个富豪都没有族谱,就不确定要找的这两个node在不在树中。

                         这样就得遍历全部的node了,并且从叶子开始往根查。

                         比如查到某个节点是富豪一的名字,记录下找到的富豪数目,account = 1;

                         i)然后继续再往根找。如果找到了另外一个富豪的名字,并且这个富豪的兄弟沈万一没有一个子孙名字是要找的富豪名字。 那就能断定富豪沈万三就是另外一个富豪的祖宗。

                         ii) 继续往根上找,没有找到第二个富豪的名字。也就是说整棵树上就找到一个富豪。那这两个富豪没有公共祖先。

  二。

          第二种解法就是找根到两个要找的节点的路径,然后记录下来。

           比如ABCDE 和ABCDF 是两个root->target node的路径。

           那前面相同的ABCD都是EF的祖先,最小祖先就是D了。

           这个解法适合树中的数据结构有parent指针的情况,或者求两个node之间的最短path。

具体分析几个典型的例子:

1650. Lowest Common Ancestor of a Binary Tree III

该题目提供了parent 指针,那就能按照解法二找到node到root的路径,然后排除掉相同的node。就能找到最小的祖先了。

但是该题目提供了另外一种解法,运用数学知识来处理问题。

寻找6,4的公共祖先, 6到root经过的路径L1,再加上4到5的路径L2 和4到root再加上6到LCA的路径长度一样。

问题就转化为

    指向6的指针先走到root,然后再从4 走。

    指向4的指针先走到root,然后再从6走。

    走到最后两个指针肯定会重逢。那就找到了LCA节点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值