后序遍历

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 01:22:59
1、根据前序与中序,推导二叉树。举例来说:前序ABC,中序CAB,由前序直到A为根节点,由中序知道A的左边为左孩子,右边为右孩子。C为左孩子,B为右孩子。 2、思考,由前序和后续,能否退出二叉树?   前序ABC,后序CBA。由前序ABC知道A为根节点,后面分成两块,每一块都是前序,前面一块为左孩子,后面一块为右孩子。由后序知道A为根节点,前面分成两块,每一块都是后序,前面一块为左孩子,后面一块为右孩子。都是分成两块,对于分成的两块,前面一块元素集合相同,后面一块元素集合相同。注意,集合不考虑元素的顺序。这样,就有两种情况:   a、前面一块为BC,后面一块为空   b、前面一块为空,后面一块为BC   因此,根据前序与后序不能推导出二叉树。 3、思考,前序与后序一定不能推导出二叉树吗?   考虑,前序ABC,后续BCA,同样道理,分成两块的情况:   a、前面一块为B,后面一块为C   b、前面一块为BC,后面一块为空   c、前面一块为空,后面一块为BC   分成两块,每一块都是前序或者后序,但是,前序与后序的顺序一定不一样,对于b,c两种情况,前序与后序顺序一样,因此排除,只剩下a情况。推导出唯一的二叉树。 因此,根据前序与后序不能推导出二叉树,但是某些特殊情况下,可以推导出二叉树。 转载于:https://www.cnblogs.com/nzbbody/p/3450168

图的遍历

雨燕双飞 提交于 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 前序遍历(先序遍历) 对于一棵树的前序遍历,递归的写法是最简单的(写起来),就是将一个大的问题转化为几个小的子问题,直到子问题可以很容易求解,最后将子问题的解组合起来就是大问题的解。

二叉树的非递归后序遍历(python)

ⅰ亾dé卋堺 提交于 2019-11-26 17:31:40
# 本代码包括建树过程 class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None # 建树 def creatTree(data, index): pNode = None if index < len(data): if data[index] == '#': return pNode = TreeNode(data[index]) pNode.left = creatTree(data, 2 * index + 1) pNode.right = creatTree(data, 2 * index + 2) return pNode # 后序遍历 def postOrder(root): if not root: return [] p = root stack, res = [root, ], [] while stack: root = stack.pop() res.append(root.val) if root.left: stack.append(root.left) if root.right: stack.append(root.right) return res[::-1] data = [s for s in input().split(' ')