正如一句老话所说——磨刀不误砍柴功,在为面试或者复试准备算法题的时候,尽量先不要直接钢,直接钢的后果就是刷题进度缓慢,没有多大效果。
本人目前觉得较好的一个方法是一个个专题的刷,先根据专题刷一些简单或中等难度的题目,熟悉或者背诵相关模板,在能力达到一定级别后,去刷一刷周赛,随机做一做题目。
那么为什么我本次算法复习之路从树
这一专题刷起,主要是如下考虑:
树
的结构可以用链表或线性表的方式保存,这样我们先开始刷 树
专题,等于可以复习链表和线性表的一些知识点。树
相关知识点解决。综上所述就是我先开始钢 树
专题的原因。
那么 树
专题的模板也有很多,比如二叉树的三种递归遍历、非递归遍历,最近公共祖先(LCA),叶子节点到根节点路径的建立等等,都有相关的模板可以去参考,那么刚开始让我们从这些模板开始进行学习。
这里大家要根据题目的提示进行更改,但大部分的流程雷同,有的题目定义深度为路径中的边的个数,有的为路径上的节点个数。
def dfs(root,depth):
if not root: return depth
else:
return max(dfs(root.left,depth+1),dfs(root.right,depth+1))
def dfs(root,depth):
if not root:
return depth
elif root.left and not root.right:
return dfs(root.left,depth+1)
elif root.right and not root.left:
return dfs(root.right,depth+1)
else:
return min(dfs(root.left,depth+1),dfs(root.right,depth+1))
一般深度为叶子节点到根节点的距离,所以注意与树最大深度算法的区别。
这里定义:树的高度为从根节点到叶子节点的边个数
def dfs(root):
if not root:
return -1
height = 1 + max(dfs(root.left),dfs(root.right))
return height
def dfs(root,t,path,found):
if not root: return
if found: return
path.append(root)
if(root == t):
found = True
dfs(root.left,t,path,found)
dfs(root.right,t,path,found)
if not found:
path.pop()
def dfs(root,path,ret):
if not root: return
path.append(root)
if(not root.left and not root.right):
ret.append(path)
dfs(root.left,path,ret)
dfs(root.right,path,ret)
path.pop()
有了以上基础知识点,可以解决以下问题
104. Maximum Depth of Binary Tree
111. Minimum Depth of Binary Tree
559. Maximum Depth of N-ary Tree
1302. Deepest Leaves Sum
257. Binary Tree Paths