遍历

L2-006 树的遍历 (25 分)

匿名 (未验证) 提交于 2019-12-02 23:26:52
L2-006 树的遍历 (25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。 输出格式: 在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。 输入样例: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 输出样例: 4 1 6 3 5 7 2 题解 递归建树 代码 # include <iostream> # include <vector> # include <queue> using namespace std ; struct BinTree { int val ; BinTree * left , * right ; } ; vector < int > post_order , in_order ; int n ; BinTree * BuildTree ( BinTree * root , int l , int r , int pl , int pr ) { if ( l > r || pl > pr ) return nullptr ; root = new BinTree ; root - > val = post_order

C++数组实现二叉树遍历的代码

匿名 (未验证) 提交于 2019-12-02 23:05:13
下边代码是关于C++数组实现二叉树遍历的代码。 # include struct node { int l,r; }; struct node tree[100]; int path[100]; int ans; void init() { int i; ans = 0; for(i = 0 ; i < 100 ; i ++ ) tree[i].l = tree[i].r = -1,path[i] = -1; } void preOrderTree(int root) { if(root == -1 ) return ; path[ans++] = root; preOrderTree(tree[root].l); preOrderTree(tree[root].r); } int main() { int T,i,n; int root,a,b,c; scanf("%d",&T); while(T--) { init(); scanf("%d",&n); scanf("%d",&root); for(i = 0 ; i < n -1; i ++) { scanf("%d%d%d",&a,&b,&c); if(c == 0) { tree[a].l = b; } else { tree[a].r = b; } } preOrderTree(root); for(i = 0 ; i

OI树上问题 简单学习笔记

匿名 (未验证) 提交于 2019-12-02 23:05:13
树上一点,满足删除该点时,树内剩下的子树最大节点数最小。 1、树的重心每棵子树的大小一定小于等于 \(n/2\) 2、每颗子树的大小都小于等于 \(n/2\) 的点一定是这棵树的重心(就是上一个的逆定理) 3、树中所有点到某个点的距离和中,到重心的距离和最小(如果有两个重心,他们的距离一样) 证明:我们考虑使用调整法,设当前最优决策为u点,v为u的任意相邻节点。记size(x)为当u为整棵树的根时,以x为根的子树的节点的大小。 u为全局最优决策当且仅当 \(n-size(v)\ge size(v)\) ,否则最优策略一定在不满足该条件的v的子树中。 我们化简这个式子,即 \(size(v)\le n/2\) 由定理2得,该点为树的重心。 4、两棵树通过一条边相连成为一颗新的树,新树重心一定在原来两棵树得重心的路径上。(注意中心不止一个的情况) 例题:cf civilization 方法1:处理出每个节点的????,依次枚举点,模拟删除该点后各子树大小,更新最优解。 方法2:采用“调整法”的思想,从一个点出发,调整过去。 两种方法都是Ο(?)的。 树(可带权)上最长的简单路径。 1、一棵树的直径可能有若干条,但是有一点显然――他们一定两两相交,不然我们就一定可以找出一条更长的。 2、所有直径的交集一定非空。因为如果三条直径两两相交。如果他们没有共同交集,那么就会形成环

邻接表的深度优先遍历

匿名 (未验证) 提交于 2019-12-02 23:03:14
版权声明:不得博主同意,不得转载 https://blog.csdn.net/gjs935219/article/details/85228598 #include<iostream> using namespace std; #define max 100 int i,j,m1,m2,n1,n2,w,visited[100]; typedef struct ArcNode { //边结点 int adjvex; //该边所指向的顶点位置 struct ArcNode * nextarc; //指向下一条边的指针 int otherthing; } ArcNode,*Arclist; typedef struct VNode { char data; ArcNode *firstarc; //指向第一条依附该顶点的边的指针 (注意类型为ArcNode) } VNode,adjlist[max]; typedef struct { adjlist vertices; int vexnum,arcnum; } ALGraph; int location(ALGraph G,int n) { for(i=0;i<G.vexnum;i++) if(G.vertices[i].data==n)return i; } void creatgraphal(ALGraph *G) { int i

中序遍历二叉树(关键词:树/二叉树/中序遍历/中根遍历/中序搜索/中根搜索/前序)

匿名 (未验证) 提交于 2019-12-02 23:03:14
版权声明:本文为博主原创文章,可以转载,但转载前请联系博主。 https://blog.csdn.net/qq_33528613/article/details/84946677 中序遍历二叉树 递归算法 def inorderTraversal(root): f = self.inorderTraversal return f(root.left)+[root.val]+f(root.right) if root else [] 非递归算法 def inorderTraversal(root): stack, res = [(root, False)], [] while stack: node, seen = stack.pop() if node: if seen: res.append(node.val) else: stack.extend([(node.right, False), (node, True), (node.left, False)]) return res 参考文献: 94. Binary Tree Inorder Traversal - LeetCode ; 这是印象笔记中的笔记,如果是在CSDN手机APP上查看此博客,请在印象笔记手机APP中搜索该参考文献: https://app.yinxiang.com/shard/s44/nl/9329661

图的深度优先遍历

匿名 (未验证) 提交于 2019-12-02 22:59:29
建立的图有四个节点,用深度优先遍历 c语言代码如下: #include<stdio.h> #include<stdlib.h> #define null 0 typedef struct{ char info[4]; int lin[4][4]; int old[4]; }Graph; void DFS(Graph *g,int i) { int j; if(g->old[i]==0) { printf("%c",g->info[i]); g->old[i]=1; for(j=0;j<4;j++) { if(g->lin[i][j]&&!g->old[j]) { DFS(g,j); } } } } int main() { Graph g1; g1.info [0]=‘a’; g1.info [1]=‘b’; g1.info [2]=‘c’; g1.info [3]=‘d’; //printf("%c", g1.info [0]); int i,j; for(i=0;i<4;i++) for(j=0;j<4;j++) g1.lin[i][j]=null; g1.lin[0][1]=1; g1.lin[1][2]=1; g1.lin[2][0]=1; //printf("%c", g1.info [0]); for(i=0;i<4;i++) g1.old[i]=0; for(i=0

数据结构-二叉树遍历

匿名 (未验证) 提交于 2019-12-02 22:59:29
这篇博文主要是研究二叉树遍历的递归与非递归算法,有兴趣的小伙伴可以了解下! 二叉树的递归遍历(深度优先遍历) 先来张图,看看各结点遍历时的情况: 二叉树深度优先遍历总结( 分别为第一次,第二次,第三次进入某个结点 ): 先序遍历:先访问根结点,然后先序遍历左子树,最后先序遍历右子树; 根->左->右 中序遍历:先中序遍历左子树,然后访问根结点,最后中序遍历右子树; 左->根->右 后续遍历:先后序遍历左子树,然后后序遍历右子树,最后访问根结点; 左->右->根 递归遍历内部有系统栈,其作用: 1.保护现场(类似存档) 2.恢复现场(类似读档) 递归遍历代码比较简单,先、中、后序遍历递归代码基本相似,总代码: void r(BTNode *p) { if (p != NULL) { //第一次进入-先序 r(p->lchild); //第二次进入-中序 r(p->rchild); //第三次进入-后序 } } 先序遍历递归函数: void r(BTNode *p) { if (p != NULL) { visit(p); r(p->lChild); r(p->rChild); } } 二叉树的非递归遍历(深度优先遍历) 须知:需要自定制辅助栈 1.先序遍历非递归: 1).利用辅助栈将根节点入栈,出栈操作,访问该节点,将其右、左孩子分别入栈(每次访问节点后,对其左、右孩子需要做一个检测

Optaplanner - 入门介绍

匿名 (未验证) 提交于 2019-12-02 22:56:40
OptaPlanner背景   在上一篇里喷了不少水,这一篇准备放点干货;其实也没办法完全干,因为很多预备知道在交待一下。好了,说一下关于OptaPlanner的背景、应用兼容性及其原理。 这一篇先说一下OptaPlanner是何方神圣,再看看它适用于哪种平台(.NET能用吗?老旧系统能用吗?),再从原理上探究一下,它是如何帮我们把一个看上去几乎不可能实现的工作,努力做到比经验丰富的老师傅更好的。下一篇我将会讲解OptaPlanner相关的基本概念,并教大家它的examples(示例)运行起来(这些examples可是好东西喔,并且非常丰富)。   顾名思义,叫什么planner的,它肯定是用来plan东西的东东,就是把一堆东西(数据)扔进去,再教它一些规则(Drools脚本或Java写的算分程序),然后它就运用它的数学头脑,把这些东东按要求把它初始化好,并努力找到一个相对最优的方案;如果数据不是太多,那它就能找到一个绝对最优方案了,因为它以把所有情况都篇历。例如:你有一堆任务需要确定分配到哪些机台,需要计算每个任务什么时候开始处理(也就是明细的生产计划了);用OptaPlanner跑完之后,就会给出一个方案,这个方案包含了每个任务应该放在哪个机台,应该在什么时候开始。又例如:在医院等单位进行医护人员排班时,把各个医护人员的专长,每个人员的作息信息

python遍历文件

和自甴很熟 提交于 2019-12-02 22:55:36
一:只获取指定文件下的内容 利用os下的listdir,可以获取到指定路径下的各种文件名,返回结果是一个列表,但这个列表的顺序是按照文件字母的顺序从a-z排序的,如遍历E:\java这样一个文件,内容如下: 看一下代码: import os path = "E:\Java" result = os.listdir(path) print(result) 输出内容如下: ['bin', 'COPYRIGHT', 'db', 'include', 'jdk1.8.0_191', 'jre', 'lib', 'LICENSE', 'README.txt', 'release', 'THIRDPARTYLICENSEREADME-JAVAFX.txt', 'THIRDPARTYLICENSEREADME.txt', 'Welcome.html'] 可以看到是一个已经经过排序的列表。 二:分别获取到目录和文件 利用os.listdir可以很方便的获取到指定目录下的各种文件名,但却不知道那些是目录,那些是文件,os.walk可以解决这个问题,菜鸟教程上说 os.walk返回的是一个三元组 (root,dirs,files), root 所指的是当前正在遍历的这个文件夹的本身的地址 dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录) files 同样是 list ,