技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完。
目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和精力有限,其他语言的实现有兴趣的朋友请自己尝试。
初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式聊到大数据框架,从大数据聊到人工智能,... ...。
如果有任何问题可以在文章后评论或者私信给我。
我会持续分享下去,敬请您的关注。
LeetCode 404. 左叶子之和(Sum of Left Leaves)
问题描述:
计算给定二叉树的所有左叶子之和。
示例:
C语言实现:
我们知道求所有叶子节点的方法,是递归的将左右子树的叶子节点值相加。
这道题只是在此基础上增加了一个条件而已,即需要加一个判断以确定一个叶子节点是否是左叶子节点。
这里我们有两种方法。
第一种方法:
直接判断是否是左叶子节点,如果是,那么返回它的值与右边兄弟节点递归的结果的和,因为它的兄弟节点不一定是叶子节点,所以还要递归。
如果某节点的左右节点都不是叶子节点,那么就返回其左右节点递归的和,这个很容易理解。
代码如下:
第二种方法:
这需要定义一个新的递归函数,使得在遍历的时候标记接下来的节点是否是左节点。
如果下面要遍历的节点是当前节点的左节点,那么除了将左节点传递给新函数外,还有传递一个true值给新函数,以标记这是一个左节点,同样的,如果是右节点,传递右节点和一个false给新函数。那么新函数在做处理的时候,首先看传过来的参数,如果标记这是一个左节点,那么返回它的值。否则继续递归该节点的子节点并返回他们的和。
代码如下:
从代码来看这两种实现都很类似,但是原理是有些不同的。
他们的算法复杂度是相同的,性能上的表现也基本一致。
python语言的实现:
python的实现用的是第一种方式,第二种方式,读者自行尝试。
代码如下:
Java语言的实现:
Java 的实现用的是第一种方式,第二种方式,读者自行尝试。
代码如下: