前序遍历

二叉树的创建与递归和非递归遍历

瘦欲@ 提交于 2020-01-29 23:53:28
二叉树的常规操作就是遍历,这也是二叉树的基本功之一 class TreeNode(): def __init__(self, x): self.val = x self.left = None self.right = None class BinaryTree(object): def __init__(self, pre, tin): self.pre = pre self.tin = tin self.levelTrave = [] # 层次遍历结果 self.preTraveRecur = [] # 前序递归遍历结果 self.preTraveNoRecur = [] # 前序非递归遍历结果 self.inTraveRecur = [] # 中序递归遍历结果 self.inTraveNoRecur = [] # 中序非递归遍历结果 self.postTraveRecur = [] # 后序递归遍历结果 self.postTraveNoRecur = [] # 后序非递归遍历结果 # 利用前序遍历和中序遍历结果重建二叉树 def reConstructBinaryTree(self, pre, tin): # pre为前序遍历结果,tin为中序遍历结果 if len(pre) == 0: return None if len(pre) == 1: return

二叉树的遍历

醉酒当歌 提交于 2020-01-29 20:47:50
1、二叉树的广度遍历 2、二叉树的深度遍历 二叉树的深度遍历,包括了前序遍历、中序遍历、后续遍历。其命名方式是根节点的遍历顺序, 即:先序遍历:先遍历根节点(根节点->左子树->右子树),即先访问根节点再递归的访问左子树,然后递归的访问右子树。 中序遍历:访问的中间位置为根位置,其主要顺序为(左子树->根节点->右子树),即我们先递归的使用中序遍历访问左子树,让后根节点,然后递归的使用中序遍历访问右子树。 后序遍历:最后访问根节点(左子树->右子树->根节点),即我们先递归的使用后续遍历访问左子树,然后递归的使用后续遍历右子树,最后访问根节点 来源: CSDN 作者: lianchaozhao 链接: https://blog.csdn.net/weixin_40809627/article/details/104105319

二叉树的遍历.队列与栈实现

天大地大妈咪最大 提交于 2020-01-29 20:45:32
树的遍历方法有广度优先(层序遍历),以及深度优先两种方法,分成先序遍历,中序遍历,后序遍历三种。 一.深度优先: 1.递归实现: 先序遍历 输出顺序:根节点,左子树,右子树。 void PreOrderTraversal ( BinTree BT ) { if ( BT ) { //如果树非空 printf ( "%d" , BT - > Data ) ; //输出根节点 PreOrderTraversal ( BT - > Left ) ; //继续递归执行其左子树 PreOrderTraversal ( BT - > Right ) ; //继续递归其右子树 } } 中序输出:左子树,根节点,右子树。 只需要将输出语句放到两个递归语句之间即可。 void PreOrderTraversal ( BinTree BT ) { if ( BT ) { PreOrderTraversal ( BT - > Left ) ; printf ( "%d" , BT - > Data ) ; PreOrderTraversal ( BT - > Right ) ; } } 后序输出:左子树,右子树,根节点。 void PreOrderTraversal ( BinTree BT ) { if ( BT ) { PreOrderTraversal ( BT - > Left ) ;

二叉树的非递归遍历

牧云@^-^@ 提交于 2020-01-29 04:41:47
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1.递归实现 void preOrder1(BinTree *root) //递归前序遍历 { if(root!=NULL) { cout<<root->data<<" "; preOrder1(root->lchild); preOrder1(root->rchild); }} 2.非递归实现 根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下: 对于任一结点P: 1)访问结点P,并将结点P入栈; 2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P; 3

C/C++树遍历的应用-树的重建

断了今生、忘了曾经 提交于 2020-01-29 01:35:58
输入: 第1行输入二叉树的结点数 第2行输入前序遍历的结点编号序列,相邻编号用空格分开 第3行输入中序遍历的结点编号序列,相邻编号用空格分开 输出: 在1行中输出后序遍历的结点编号序列,用空格分开 代码 # include <iostream> # include <string> # include <algorithm> # include <vector> using namespace std ; int n , pos ; vector < int > pre , in , post ; void rec ( int l , int r ) { if ( l >= r ) return ; int root = pre [ pos ++ ] ; int m = distance ( in . begin ( ) , find ( in . begin ( ) , in . end ( ) , root ) ) ; rec ( l , m ) ; rec ( m + 1 , r ) ; post . push_back ( root ) ; } void solve ( ) { pos = 0 ; rec ( 0 , pre . size ( ) ) ; for ( int i = 0 ; i < n ; i ++ ) { if ( i ) cout << " " ;

重建二叉树

对着背影说爱祢 提交于 2020-01-28 05:07:09
题目:重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路 前序遍历:中左右 中序遍历:左中右 根据pre[0]=vin[i]找出根(mid)的位置,递归左右子树 #include<iostream> #include<vector> #include<queue> #include<stack> using namespace std; struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x): val(x), left(NULL), right(NULL){ } }; class Solution{ public: // 思路:递归左右子树,找出左右的pre和vin TreeNode *reConstructBinaryTree(vector<int> pre, vector<int> vin){ int mid, size=pre.size(); if(size==0) return NULL; TreeNode *root = new TreeNode(pre[0]); //

二叉树遍历 递归非递归

霸气de小男生 提交于 2020-01-27 22:06:12
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1.递归实现 void preOrder1(BinTree *root) //递归前序遍历 { if(root!=NULL) { cout<<root->data<<" "; preOrder1(root->lchild); preOrder1(root->rchild); }} 2.非递归实现 根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下: 对于任一结点P: 1)访问结点P,并将结点P入栈; 2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P; 3

二叉树遍历(递归、非递归)

喜你入骨 提交于 2020-01-27 04:51:59
1、递归遍历 1 void helper(TreeNode* root, vector<int>& res) { 2 if (root) { 3 res.push_back(root->val); 4 helper(root->left, res); 5 helper(root->right, res); 6 } 7 } 把3~5行按照访问顺序交换一下位置,就能实现前序遍历、中序遍历和后序遍历。 2、非递归遍历 非递归遍历可以用栈实现。 a. 前序遍历(144. Binary Tree Preorder Traversal) 前序遍历节点访问次序是 根-左-右 所以对于弹出的每一个节点,进栈顺序是先右孩子,再左孩子 1 class Solution { 2 public: 3 vector<int> preorderTraversal(TreeNode* root) { 4 vector<int> res; 5 stack<TreeNode*> stk; 6 if(root) 7 stk.push(root); 8 while (!stk.empty()) { 9 TreeNode *temp = stk.top(); 10 stk.pop(); 11 res.push_back(temp->val); 12 if (temp->right) 13 stk.push(temp-

递归示例(一):遍历二叉树

心已入冬 提交于 2020-01-26 18:46:30
最近做项目经常用到递归,刚开始很久没用,不太熟悉,现在研究了下,并写下了学习笔记及开发经验总结。 递归热身 一个算法调用自己来完成它的部分工作,在解决某些问题时,一个算法需要调用自身。如果一个算法直接调用自己或间接地调用自己,就称这个算法是递归的(Recursive)。根据调用方式的不同,它分为直接递归(Direct Recursion)和间接递归(Indirect Recursion)。 比如,在收看电视节目时,如果演播室中也有一台电视机播放的是与当前相同的节目,观众就会发现屏幕里的电视套有一层层的电视画面。这种现象类似于直接递归。 如果把两面镜子面对面摆放,便可从任意一面镜子里看到两面镜子无数个影像,这类似于间接递归。 一个递归算法必须有两个部分:初始部分(Base Case)和递归部分(Recursion Case)。初始部分只处理可以直接解决而不需要再次递归调用的简单输入。递归部分包含对算法的一次或多次递归调用,每一次的调用参数都在某种程度上比原始调用参数更接近初始情况。 函数的递归调用可以理解为:通过一系列的自身调用,达到某一终止条件后,再按照调用路线逐步返回。递归是程序设计中强有力的工具,有很多数学函数是以递归来定义的。 如大家熟悉的阶乘函数,我们可以对n!作如下定义:f(n)= 1 (n=1) n*f(n-1) (n>=2) 一个算法具有的特性之一就是有穷性

已知树的前序和中序遍历,求后序遍历;后序和中序,求前序

∥☆過路亽.° 提交于 2020-01-25 13:29:48
首先需要说明的是,网上不知道为什么很多误传,说给定前序、中序和后序中的两个,可以唯一确定另一个,显然这是错误的。给定前序和后序,是无法确定中序的,一个简单的例子就是只有两个节点的树,前序和后序给定,中序无法确定。 代码如下: 1 /* 2 * Copyright (c) 2014 3 * All Rights Reserved. 4 * author: laohaizi 5 */ 6 7 #include <iostream> 8 #include <string> 9 #include <string.h> 10 #include <stdio.h> 11 using namespace std; 12 13 typedef struct _NODE 14 { 15 char name; 16 struct _NODE *left,*right; 17 }NODE; 18 19 char *preorder="abcdefg"; 20 char *inorder="cbedagf"; 21 //char *inorder="abcdefg"; 22 char *postorder="cedbgfa"; 23 const int preorder_len = strlen(preorder); 24 const int inorder_len = strlen(inorder);