LeetCode专题——树

LeetCode专题——树

一、前提

正如一句老话所说——磨刀不误砍柴功,在为面试或者复试准备算法题的时候,尽量先不要直接钢,直接钢的后果就是刷题进度缓慢,没有多大效果。

本人目前觉得较好的一个方法是一个个专题的刷,先根据专题刷一些简单或中等难度的题目,熟悉或者背诵相关模板,在能力达到一定级别后,去刷一刷周赛,随机做一做题目。

那么为什么我本次算法复习之路从这一专题刷起,主要是如下考虑:

  • 的结构可以用链表或线性表的方式保存,这样我们先开始刷 专题,等于可以复习链表和线性表的一些知识点。
  • 一些算法,比如二分查找法、快排、堆排、DFS、BFS,其实底层都可以用 相关知识点解决。

综上所述就是我先开始钢 专题的原因。

那么 专题的模板也有很多,比如二叉树的三种递归遍历、非递归遍历,最近公共祖先(LCA),叶子节点到根节点路径的建立等等,都有相关的模板可以去参考,那么刚开始让我们从这些模板开始进行学习。

二、算法模板

2020年7月19日

2.1 树最大深度(Max depth)

这里大家要根据题目的提示进行更改,但大部分的流程雷同,有的题目定义深度为路径中的边的个数,有的为路径上的节点个数。

def dfs(root,depth):
    if not root: return depth
    else:
        return max(dfs(root.left,depth+1),dfs(root.right,depth+1))
2.2 树最小深度(Min depth)
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))

一般深度为叶子节点到根节点的距离,所以注意与树最大深度算法的区别。

2.3 树的高度(Height)

这里定义:树的高度为从根节点到叶子节点的边个数

def dfs(root):
    if not root:
        return -1
    height = 1 + max(dfs(root.left),dfs(root.right))
    return height
2.4 构建根节点到指定节点的路径
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()
2.5 找到所用从根节点到叶子节点的路径
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

你可能感兴趣的:(LeetCode)