七。图
一.图相关
1.图本质上可以认为是多叉树的延伸。面试笔试中很少出现图问题,就算有,也是简单的遍历问题,基本上可以完全照搬多叉树的遍历
1 //基本的N叉树节点
2 class TreeNode{
3 int val;
4 TreeNode[] children;
5 }
6 //图节点的逻辑结构
7 class Vertex{
8 int val;
9 Vertex[] neighbors;
10 }
2.图的逻辑结构的具体实现
(1)逻辑结构:由节点和边构成
(2)具体实现:邻接表,邻接矩阵(很少用Vertex类来实现)
邻接表:把每个节点n的邻居都存到一个列表里,然后把n和这个列表关联起来,这样就可以通过一个节点n找到它的所有相邻节点
邻接矩阵:是一个二维布尔数组matrix
3.分类:
有向图,无向图。无权图,加权图。
4.图的遍历
(1)多叉树的遍历(前序遍历,后序遍历)
1 //前序遍历
2 public void traverse(TreeNode root) {
3 if(root==null)
4 return;
5 res.add(root.val);
6 for(TreeNode node : root.children) {
7 traverse(node); //递归遍历每一个子树
8 }
9 }
N429多叉树的层序遍历:(多叉树比较特殊,根节点不在数组里面,但不影响,因为就是从根节点开始遍历的,根引用直接指向了根节点)
(2)图和多叉树的最大区别就是:图是可能包含环的,从某一节点开始遍历,可能又回到这个节点
所以,如果图包含环,遍历框架就需要一个visited数组进行辅助