中序遍历

PTA L2-006 树的遍历 (25 分)

╄→гoц情女王★ 提交于 2019-11-27 01:31:42
题目描述: 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数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 解题思路: 这题是给定后序和中序的遍历,可以通过后序确定根节点,在通过根节点将中序分为左子树和右子树和根节点,然后通过左子树和右子树可以将后序也分成左子树和右子树和根节点,然后其实就是重复这个过程来建树,最后层序遍历用广搜就行了 AC代码: #include <iostream> #include<stdio.h> using namespace std; int tree[5000]; int a; void gettree(int b[500],int c[500],int num,int tb,int tc) { if(tb==0||tc==0) { return; } int b1[35]; int c1[35]; int tb1=0; int tc1=0; int n=0; for(n=0;n<tc;n++) { if(c

【转】二叉树的非递归遍历

和自甴很熟 提交于 2019-11-27 01:23:49
原文: http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1.递归实现 void preOrder1(BinTree * root) // 递归前序遍历 { if (root != NULL) { cout << root -> data << " " ; preOrder1(root -> lchild); preOrder1(root -> rchild); } } 2.非递归实现 根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下: 对于任一结点P: 1)访问结点P,并将结点P入栈

二叉树非递归遍历

淺唱寂寞╮ 提交于 2019-11-27 01:23:05
1、二叉树递归遍历很简单,以前序遍历为例说明: 1 void PrefixOrder(Node* node) 2 { 3 if (node!= NULL) 4 { 5 cout<<root->value<< " " ; 6 PrefixOrder(root-> lchild); 7 PrefixOrder(root-> rchild); 8 } 9 }   中序遍历和后序遍历类似。 2、考虑二叉树非递归遍历,思路:前序遍历特点,访问当前节点,然后访问左孩子,左孩子有孩子,继续访问左孩子的左孩子节点,直到没有左孩子,访问右孩子。因此。非递归遍历的思路就是,使用while,记录当前节点,往左一条路走到底,然后原路后退,访问右节点。 转载于:https://www.cnblogs.com/nzbbody/p/3450144.html 来源: https://blog.csdn.net/weixin_30231093/article/details/99234535

图的遍历

雨燕双飞 提交于 2019-11-27 00:24:02
没有用的话qaq : Ummmm…图论的大部分知识本来早就有学过,只是一直没有写成博文来梳理,但既然上了qbxt DP图论就写一篇来总结下, 主要是来听DP的,但…由于太菜的原因,DP听得天花乱坠QWQ 图的遍历分为两种,图的深度优先遍历和图的广度优先遍历,深度优先遍历是用栈来实现的,可以用手写栈,也可以递归(要小心没开栈的时候爆栈) 一,图的深度优先遍历 实现很简单,和dfs一样,分为以下几个步骤 1,从起点s开始遍历 2,当遍历到节点u时,如果u节点没有被访问过,那么就访问u在访问u没有被访问过的相邻节点,一直到头.... 3,当所有节点都被访问之后,遍历结束。 inline void dfs(int s) { vis[s]=true; for(int i=first[s];i;i=edge[i].nxt) { if(!vis[edge[i].ed]) dfs(edge[i].ed); } } 二叉树的三种dfs序:先序遍历,中序遍历,后序遍历 1,前序遍历:先访问根节点,然后依次访问每一棵子树,如上述过程一样。 比如上图的先序遍历为B,F,E,K,L 2,中序遍历:先访问左子树,再访问根节点,再访问右子树。 比如上图的中序遍历为F,B,K,E,L 3,后序遍历:先访问左子树,再访问右子树,最后访问根节点 比如上图的后序遍历为F,K,L,E,B * 二,图的广度优先遍历

HRBUST 2040 二叉树的遍历

和自甴很熟 提交于 2019-11-27 00:16:12
给出一棵二叉树的中序和前序遍历,输出它的后序遍历。 Input 本题有多组数据,输入处理到文件结束。 每组数据的第一行包括一个整数n,表示这棵二叉树一共有n个节点。 接下来的一行每行包括n个整数,表示这棵树的中序遍历。 接下来的一行每行包括n个整数,表示这棵树的前序遍历。 3<= n <= 100 Output 每组输出包括一行,表示这棵树的后序遍历。 Sample Input 7 4 2 5 1 6 3 7 1 2 4 5 3 6 7 Sample Output 4 5 2 6 7 3 1 这里后序遍历写了一个非递归,嗯,为考研做准备。 代码: #include <stdio.h> #include <stdlib.h> typedef struct Node { int Data; struct Node *Left,*Right; }Node; int q[100],z[100];///q记录前序遍历 z记录中序遍历 Node* creatNode() { Node *node = (Node *)malloc(sizeof(Node)); if(node == NULL) exit(0); node -> Left = node -> Right = NULL; return node; } Node* rTree(int q1,int q2,int z1,int z2)

数据--第36课 - 遍历二叉树

穿精又带淫゛_ 提交于 2019-11-27 00:05:45
第36课 - 遍历二叉树 1. 什么是遍历 单链表的遍历是指从第一个节点开始(下标为0的结点),按照某种次序一次访问每一个结点。 二叉树的遍历是指从根节点开始,按照某种次序一次访问二叉树中的所有结点。 2. 前序遍历 若二叉树为空:空操作返回。 若二叉树不为空:访问根节点中的数据,前序遍历左子树,前序遍历右子树。 结果:1,2,4,8,9,5,10,3,6,7 3. 中序遍历 若二叉树为空:空操作返回。 若二叉树不为空:中序遍历左子树,访问根节点中的数据,中序遍历右子树。 结果:8,4,9,2,10,5,1,6,3,7 4. 后序遍历 若二叉树为空:空操作返回。 若二叉树不为空:后序遍历左子树,后序遍历右子树,访问根节点中的数据。 结果:8,9,4,10,5,2,6,7,3,1 5. 层次遍历 若二叉树为空:空操作返回。 若二叉树不为空:访问根节点中的数据,访问下一层的结点数据...... 6. 程序 main.c #include <stdio.h> #include <stdlib.h> #include "BTree.h" #include "LinkQueue.h" /* run this program using the console pauser or add your own getch, system("pause") or input loop */

c++ 二叉树遍历

时光总嘲笑我的痴心妄想 提交于 2019-11-26 23:16:07
题目描述 二叉树是每个内部结点最多只有两个子结点且两个子结点有序的树。如下图就是一棵二叉树: 对于一棵二叉树,有三种基本遍历方式: 1.前序遍历:先访问根结点,然后再前序遍历左子树,最后前序遍历右子树; 2.中序遍历:先中序遍历左子树,然后访问根结点,最后中序遍历右子树; 3.后序遍历:先后序遍历左子树,然后后序遍历右子树,最后访问根结点。 对于上图,前序遍历的结果是ABDEHCFGI。中序遍历的结果是DBEHAFCIG,后序遍历的结果是DHEBFIGCA。 现在给出二叉树的前序和中序遍历,请输出相应的后序遍历。 输入 第一行前序遍历的结果 第二行中序遍历的结果 都是大写字母,且结点的标识不重复,最多只有100个结点。 输出 输出后序遍历的结果 样例输入 ABDEHCFGI DBEHAFCIG 样例输出 DHEBFIGCA Source Code #include <iostream> #include <string.h> using namespace std; char a[110],b[110];//a[]是前序遍历的结果 b[]是中序遍历的结果 void dfs(int f1,int e1,int f2,int e2) { if(f1>e1) return;//如果找不到子节点就退出(起点大于终点) int rt=f1;//rt是根节点 int p = 0; /

二叉树的前中后和层序遍历详细图解(递归和非递归写法)

断了今生、忘了曾经 提交于 2019-11-26 17:54:53
我家门前有两棵树,一棵是二叉树,另一棵也是二叉树。 遍历一棵二叉树常用的有四种方法,前序(PreOrder)、中序(InOrder)、后序(PastOrder)还有层序(LevelOrder)。 前中后序三种遍历方式都是以根节点相对于它的左右孩子的访问顺序定义的。例如根->左->右便是前序遍历,左->根->右便是中序遍历,左->右->根便是后序遍历。 而层序遍历是一层一层来遍历的。 树的前中后序遍历是个递归的定义,在遍历到根节点的左/右子树时,也要遵循前/中/后序遍历的顺序,例如下面这棵树: 前序遍历:ABDECFG 中序遍历:DBEAFCG 后序遍历:DEBFGCA 层序遍历:ABCDEFG 树的结点结构体声明如下: 语言:C语言(为了省事用到了C++的栈,因为C语言要用栈的话要自己重新写一个出来,就偷了个懒) 编译器:VS typedef char DataType; typedef struct TreeNode{ DataType data; struct TreeNode *left; struct TreeNode *right; }TreeNode; 1 2 3 4 5 6 7 前序遍历(先序遍历) 对于一棵树的前序遍历,递归的写法是最简单的(写起来),就是将一个大的问题转化为几个小的子问题,直到子问题可以很容易求解,最后将子问题的解组合起来就是大问题的解。

乱七八糟的图论1

老子叫甜甜 提交于 2019-11-26 17:19:53
图的基本概念 图是点和边组成的集合体,G=<V,E>; V是点集 E是边集 有向边,有向图 无向边,无向图 无权、点权、边权、负权 环、自环、重边、有向无环图(DAG) 路径、简单路径:没有经过重复的点、连通 树:n个点n-1条边的连通图、完全图:任何两点间都有一条边(无向图)、竞赛图:将完全图上的每条边定一个方向、基环树:有一个环,其他全是树、仙人掌:可以存在环,但是每一条边,至多只存在于一个环中 图的输入方式 最常见的输入方式是用 1 - N 表示顶点,并逐行给出 M 条边所连接的两点和边权大小。 N M u1 v1 w1 u2 v2 w2 . . . um vm wm 如果有点权,一般会用一行 N 个数表示每个点的权值大小。 p1 p2 . . . pn 邻接矩阵是最简单的图存储方式。 对于 N 个点的图,用 N × N 的二维数组记录两点之间是否有边相连,以及边权大小。 空间复杂度 O(N^2) 对于边不存在的情况,可能采用 ∞,也可能使用 0 或 -1 等等特殊值,视具体情况而定。 对于有重边的情况,可能不能完整保留所有边的信息。 邻接表是更为常用的图存储方式。 对每个点 u 用不定长度数组或链表存储所有以其为起点形如< u, v > 的边。 无向图双向边拆分为两条单向边。 不定长数组 链表 空间复杂度 O(N + M) 图的遍历方法: 广度优先搜索bfs 队列

二叉树的遍历(前、中、后序及层次遍历,递归和非递归实现)

自古美人都是妖i 提交于 2019-11-26 17:05:00
一棵二叉树: 树的先序遍历序列preorder: DBACEGF( 根左右) 树的中序遍历序列inorder: ABCDEFG(左根右) 树的后序遍历序列postorder: ACBFGED(左右根) 树的层序遍历序列levelorder:DBEACGF(按行遍历) 输入一棵二叉树的先序遍历和中序遍历序列,输出它的后序遍历序列。 输入:DBACEGF ABCDEFG 输出:ACBFGED 思路: 已知先序遍历序列的第一个一定是本树的根节点,而后在中序遍历中找到该根节点的位置,中序遍历序列中根节点左边为左子树,右边为右子树,然后开始先左子树后右子树进行递归,因为要求的后序遍历序列是左右根,故在递归完左右子树后再输出根。 Code: 1 #include<bits/stdc++.h> 2 #define IO ios::sync_with_stdio(false) 3 using namespace std; 4 string preorder,inorder,aa;//分别为先序、中序、后序 5 int n,t; 6 void recover(int l,int r) 7 { 8 if(l>=r)return; 9 int root=preorder[t++];//先序遍历的第一个点一定是根节点 10 int m=distance(inorder.begin(),find