【LeetCode解题总结】树/图篇

基本数据结构

特点

树的结构十分直观,而树的很多概念定义都有一个相同的特点:递归,也就是说,一棵树要满足某种性质,往往要求每个节点都必须满足。例如,在定义一棵二叉搜索树时,每个节点也都必须是一棵二叉搜索树
正因为树有这样的性质,大部分关于树的面试题都与递归有关,换句话说,面试官希望通过一道关于树的问题来考察你对于递归算法掌握的熟练程度。

基本知识点

  • 阶(Order)、度:出度(Out-Degree)、入度(In-Degree)
  • 树(Tree)、森林(Forest)、环(Loop)
  • 有向图(Directed Graph)、无向图(Undirected Graph)、完全有向图、完全无向图
  • 连通图(Connected Graph)、连通分量(Connected Component)
  • 存储和表达方式:邻接矩阵(Adjacency Matrix)、邻接链表(Adjacency List)

基本算法

  • 图的遍历:深度优先、广度优先
  • 二部图的检测(Bipartite)、树的检测、环的检测:有向图、无向图
  • 拓扑排序
  • 联合-查找算法(Union-Find)
    • Quick-find
    • Quick-union
    • Weighted quick-union
  • 最短路径:Dijkstra、Bellman-Ford

常见解题思路

注意事项

  • 访问根节点前要判空

解法总结

树遍历的拓展

三种遍历的迭代方式使用的都是栈,后序遍历必须使用了两个栈

  • 前序:运用最多的场合包括在树里进行搜索以及创建一棵新的树。
  • 中序:最常见的是二叉搜素树,由于二叉搜索树的性质就是左孩子小于根节点,根节点小于右孩子,对二叉搜索树进行中序遍历的时候,被访问到的节点大小是按顺序进行的。
  • 后序:在对某个节点进行分析的时候,需要来自左子树和右子树的信息。收集信息的操作是从树的底部不断地往上进行,好比你在修剪一棵树的叶子,修剪的方法是从外面不断地往根部将叶子一片片地修剪掉。
树的序列化/反序列化

检测结构是否存在

(注意考虑有向图和无向图)

环的检测、二部图的检测、树的检测以及都是基于图的遍历,尤其是深度优先方式的遍历。而遍历可以在邻接矩阵或者邻接链表上进行,所以掌握好图的遍历是重中之重

拓扑排序

题目 思路
207. 课程表

最短路径

  • Dijkstra(迪科斯彻算法的基本操作“拓展”是在深度上寻路)
    • 优点:时间复杂度低O(|E|+|V|log|V|)
    • 缺点:边的权重不可以为负数,且需要借助堆来实现
  • Bellman-Ford(BF算法的“松弛”操作则是在广度上寻路)
    • 优点:边的权值可以为负数,且实现简单
    • 缺点:时间复杂度过高 O(V|E|)
原文地址:https://www.cnblogs.com/JasonBUPT/p/11867866.html