深度优先遍历

ArangoDB 的graph查询

天涯浪子 提交于 2019-12-05 00:24:51
一个graph包含 vertices 和 edges。edges被存储在edges document当中。vertices可以是document collection 中的document也可以是edge document中的document。所以说edges也可以被当做vertices来使用。 1、数据准备 使用arangoimp导入飞机场和航班csv数据信息。 导入飞机场信息 arangoimp --file <em>path to airports.csv</em> on your machine --collection airports --create-collection true --type csv      这里我们创建了一个document collection;为每一行创建一个document.标题被作为属性名称。其中标题中包含一个_key的值,系统将自动识别该列作为_key. 现在打开浏览器(http://localhost:8529)便可以看到刚刚导入的信息了。 可以点击浏览器中的queries进行查询: 查询所有的机场 FOR airport in ariports RETURN airport      仅查询加利福尼亚机场信息 FOR airport IN airports FILTER airport.state==‘CA’ RETURN

C++二叉树的遍历:深度优先(前序、中序、后序)和广度优先(层次)

末鹿安然 提交于 2019-12-03 04:31:05
准备 深度优先遍历:沿着每一个分支路径进行深入访问。前序、中序、后序都是深度优先遍历的特例。可以用递归实现,非递归一般借助栈容器。 广度优先遍历:又叫层次遍历,对每一层依次访问。可以借助队列容器来实现。 先定义和创建一颗二叉树 #include <iostream> #include <vector> #include <queue> #include <stack> //定义二叉树结点 template<typename T> struct Node { T value; Node<T> *left; Node<T> *right; Node(const T &val) :value(val), left(nullptr), right(nullptr) {} Node(const T &val, Node<T> *&lnode, Node<T> *&rnode) :value(val), left(lnode), right(rnode) {} }; //创建二叉树 template<typename T> Node<T>* createBinaryTree(const std::initializer_list<T> &list) { std::vector<Node<T>*> vec; for (auto &item : list) { Node<T> *newNode =

二叉树的深度优先遍历和广度优先遍历

你离开我真会死。 提交于 2019-12-03 04:30:07
1. 分析 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历、中序遍历、后序遍历。具体说明如下: 先序遍历:对任一子树,先访问根,然后遍历其左子树,最后遍历其右子树。 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树。 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。 广度优先遍历:又叫层次遍历,从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。 2. 举例说明 对下图所示的二叉排序树进行遍历,要求使用先序遍历(递归、非递归)、中序遍历(递归、非递归)、后序遍历(递归、非递归)和广度优先遍历。 2.1 参考代码 package BinaryTreeTraverseTest; import java.util.LinkedList; import java.util.Queue; /** * 二叉树的深度优先遍历和广度优先遍历 * @author Fantasy * @version 1.0 2016/10/05 - 2016/10/07 */ public class

PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)

大城市里の小女人 提交于 2019-12-03 04:29:51
前言: 深度优先遍历 :对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历、中序遍历、后序遍历。具体说明如下: 前序遍历:根节点->左子树->右子树 中序遍历:左子树->根节点->右子树 后序遍历:左子树->右子树->根节点 广度优先遍历 :又叫层次遍历,从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。 例如对于一下这棵树: 深度优先遍历: 前序遍历:10 8 7 9 12 11 13 中序遍历:7 8 9 10 11 12 13 后序遍历:7 9 8 11 13 12 10 广度优先遍历: 层次遍历:10 8 12 7 9 11 13 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。 深度优先遍历: 1、前序遍历: /** * 前序遍历(递归方法) */ private function pre_order1( $root ) { if ( ! is_null( $root )) { //这里用到常量__FUNCTION__,获取当前函数名,好处是假如修改函数名的时候,里面的实现不用修改 $function = __FUNCTION__; echo $root -> key . "

二叉树遍历,深度优先遍历,广度优先遍历,前序中序后续优先遍历,层次遍历

与世无争的帅哥 提交于 2019-12-03 04:29:27
首先明白两个概念: 1. 深度遍历包括前中后序遍历三种; 2. 广度优先遍历就是层次遍历。 PS: 前中后序遍历,如果使用递归遍历,都很简单易理解; 如果使用非递归方式,首先想到的就应该是使用栈结构来控制整个过程,因为递归也是利用栈来实现的; 前中后序遍历的非递归方式中,后序遍历的非递归方式相比较而言,略复杂。 直接上代码: #include "stdlib.h" #include <iostream> #include <stack> #include <queue> using namespace std; struct BinaryTreeNode { int value; BinaryTreeNode* leftChild; BinaryTreeNode* rightChild; }; /* 前序遍历递归方式 步骤: 1.先处理当前节点 2.递归处理完左支 3.递归处理右支 */ void PreOrderRecursive(BinaryTreeNode* parent) { if(NULL == parent) return; cout<<parent->value<<" "; PreOrderRecursive(parent->leftChild); PreOrderRecursive(parent->rightChild); } /* 前序遍历非递归方式 说明:

图深度优先遍历算法(Java实现)

∥☆過路亽.° 提交于 2019-11-30 01:58:56
算法思路 节点有多个后继节点时先遍历边权重小的 指定一个起始节点 把当前节点所有后继节点按路径权值升序排序 取出第一个后继节点,以此节点为起始节点重复第二步 若当前节点没有后继节点,则回溯到仍有未访问的后继节点的节点处重复第三步 算法实现 图的实现 此实现方法没有节点类 用枚举类型 UNDISCOVERD 表示未被发现, VISITED 表示已被访问 采用邻接矩阵和顶点索引 邻接矩阵 int[][] matrix (邻接矩阵无需设置为沿对角线对称) matrix[i][j] 表示从索引 i 的节点指向索引 j 的节点的权值 权值为0表示两点不连接或者自身与自身不连接 public class Graph < T > { private int N ; // 节点个数 public int [ ] [ ] matrix ; // 邻接矩阵 private Status [ ] statuses ; // 保存每个节点的状态 private T [ ] datas ; // 保存每个节点的数据 } enum Status { // 节点对象的状态 // 未被发现, 已被遍历 UNDISCOVERD , VISITED } 重点 找出所有后继节点 index 是当前节点索引 List<Integer> toVisit 保存当前节点可能遍历的后继节点的索引 循环遍历每个节点,查询邻接矩阵

深度优先遍历 + 广度优先遍历

安稳与你 提交于 2019-11-28 17:40:24
一、核心思想 1、深度优先搜索 用栈做辅助,做回溯判断(搜索到哪一点就push,回溯就pop),直至初始点也回溯完。 2.广度优先搜索 利用队列的先进先出特点,每一轮都将当前节点的儿子们放进队列,一轮遍历结束时,当前层的儿子们已经放入队列,重复下去。 二、代码 /** * 树节点结构 */ class TreeNode { int data; TreeNode leftNode; TreeNode rightNode; public TreeNode() { } public TreeNode(int data) { this.data = data; } public TreeNode(TreeNode leftNode,TreeNode rightNode,int data) { this.leftNode = leftNode; this.rightNode= rightNode; this.data = data; } } public class Main { //广度优先遍历 public void BroadFirstSearch(TreeNode nodeHead) { if(nodeHead == null) return; Queue<TreeNode> queue = new LinkedList<>(); queue.add(nodeHead); while

java二叉树遍历——深度优先(DFS)与广度优先(BFS) 递归版与非递归版

大兔子大兔子 提交于 2019-11-28 08:05:21
介绍 深度优先遍历: 从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止。然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点为止。 广度优先遍历: 从根节点出发,在横向遍历二叉树层段节点的基础上纵向遍历二叉树的层次。 DFS实现: 数据结构:栈 父节点入栈,父节点出栈,先右子节点入栈,后左子节点入栈。递归遍历全部节点即可 BFS实现: 数据结构:队列 父节点入队,父节点出队列,先左子节点入队,后右子节点入队。递归遍历全部节点即可 树的实现 public class TreeNode<V> { private V value; private List<TreeNode<V>> childList;//子节点列表 public TreeNode(V value) { this.value = value; } public TreeNode(V value, List<TreeNode<V>> childList) { this.value = value; this.childList = childList; } public V getValue() { return value; } public void setValue(V value) { this.value = value; } public List<TreeNode<V>>

树与图的深度优先遍历,时间戳,树的深度

爷,独闯天下 提交于 2019-11-26 14:23:58
树与图的深度优先遍历 void dfs(int x) { v[x]=1;//记录点x被访问过了 for(int i=head[x];i;i=next[i])//遍历x链接的边 { int y=ver[i]; if(v[y]) continue; dfs(y); } } 关于这里的ver数组的理解一开始有些偏差,后来又翻了一遍前面的邻接表才发现之前用数组表示的邻接表的理解有些偏差,这里的head[x]指的是链接x点的第一条边,这里的i都是边,ver数组是记录的点的编号,并不是点的值,关于点的权值另有edge数组表示 时间戳: 按照深度优先遍历的过程,按照每个节点第一 次被访问的顺序,依次给与这些点1~n的整数标记,这些标记就被称为时间戳,记为dfn。 树的dfs序: 对于某个节点在刚进入递归后即回溯前各记录一次该点的编号,最后产生长度为2n的节点序列为树的DFS序。 void dfs(int x) { a[++m]=x;//进入递归时标记 v[x]=1;//记录点x被访问过了 for(int i=head[x];i;i=next[i])//遍历x链接的边 { int y=ver[i]; if(v[y]) continue; dfs(y); } a[++m]=x;//回溯前记录 } 应用:每个节点在序列里恰好出现两次,设这两次出现的位置恰好是L[i],R[i],那么闭区间[L[I],R