前序遍历

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

二叉树的遍历

我只是一个虾纸丫 提交于 2019-11-26 14:04:45
前序遍历 若树为空,则空操作返回。否则,先访问根节点,然后前序遍历左子树,再前序遍历右子树。(中 左 右) 中序遍历 若树为空,则空操作返回。否则,从根节点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历根节点的右子树。(左 中 右) 后续遍历 若树为空,则空操作返回。否则,从左到右先叶子后节点的方式遍历访问左右子树,最后访问根节点。(左 右 中) 层序遍历 若树为空,则空操作返回。否则,从树的第一层,也就是根节点开始访问,从上到下逐层遍历,在同一层中,按从左到右的顺序结点逐个访问。 /** * 前序遍历BST树的API接口 */ public void preOrder(){ System.out.print(“递归前序遍历:”); preOrder(this.root); System.out.println(); } /** * 前序遍历BST树的递归操作 VLR * @param root */ private void preOrder(BSTNode<T> root) { if(root != null){ System.out.print(root.getData() + " "); preOrder(root.getLeft()); preOrder(root.getRight()); } } /** *

前序遍历线索化二叉树

女生的网名这么多〃 提交于 2019-11-26 12:44:56
#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 typedef enum PointerTag {Link,Thread}; typedef int Status; typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; enum PointerTag LTag,RTag; }BiTNode,*BiTree; int CreateBiTree(BiTree *T); Status Visit(char e); Status PreOrderThreadTraverse(BiTree T); Status PreOrderThreadBackTraverse(BiTree T); Status PreOrderThreading(BiTree Thrt,BiTree T); void PreThreading(BiTree p,BiTree *pre); Status PreOrderTraverse(BiTree T); int main() { BiTree *T,Thrt; T=(BiTree*)malloc(sizeof(BiTree)); Thrt=(BiTree)malloc(sizeof(BiTNode)

数据结构(十四)——二叉树

久未见 提交于 2019-11-25 20:25:28
数据结构(十四)——二叉树 一、二叉树简介 1、二叉树简介 二叉树是由n(n>=0)个结点组成的有序集合,集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。 二叉树的五种形态: 2、二叉树的存储结构模型 树的另一种表示法:孩子兄弟表示法 A、每个结点都有一个指向其第一个孩子的指针 B、每个结点都有一个指向其第一个右兄弟的指针 孩子兄弟表示法的特性: A、能够表示任意的树形结构 B、每个结点包含一个数据成员和两个指针成员 C、孩子结点指针和兄弟结点指针构成树杈 3、满二叉树 如果二叉树中所有分支结点的度数都为2,并且叶子结点都在统一层次上,则二叉树为满二叉树。 4、完全二叉树 如果一棵具有n个结点的高度为k的二叉树,树的每个结点都与高度为k的满二叉树中编号为1——n的结点一一对应,则二叉树为完全二叉树。 完全二叉树的特性: A、同样结点数的二叉树,完全二叉树的高度最小 B、完全二叉树的叶子结点仅出现在最下边两层,并且最底层的叶子结点一定出现在左边,倒数第二层的叶子结点一定出现在右边。 C、完全二叉树中度为1的结点只有左孩子。 5、二叉树的特性 A、在二叉树的第i层上最多有2^(i-1)个结点(i>=1)。 B、高度为k的二叉树,最多有2^k-1个结点(k>=0)。 C、对任何一棵二叉树,如果其叶结点有n个,度为2的非叶子结点有m个,则 n = m