① 请教一下数据结构 二叉树的先序遍历 中序遍历 后序遍历 是怎么弄的
所谓先序、中序和后序的区别在于访问根的时机,分别是BLR、LBR和LRB,其中B、L、R分别表示根结点、根结点的左子树和根结点的右子树。
以后序遍历为例进行讲解。
后序遍历算法:
(1) 后序遍历根结点的左子树;
(2) 后序遍历根结点的右子树。
(3) 访问二叉树的根结点;
你的方法是将树分解为根、左子树、右子树,再将子树继续按前述方法分解,直至每一部分只剩一个结点或空为止。
对该图,分解为
根(a),根的左子树(bde,不分先后),根的右子树(cf,不分先后)
故后序的基本顺序是(bde)、(cf)、(a)
同样的道理,对(bde)和(cf)也进行分解:
根(b)、左子树(d)、右子树(e) 后序的基本顺序是deb
根(c)、左子树(空)、右子树(f) 后序的基本顺序是fc
整合起来就是:d e b f c a
② 什么叫二叉树前序遍历,中序遍历,后序遍历
二叉树的这三种遍历方法,是按照每颗子树的根节点顺序遍历的。
前序遍历就是先遍历根节点,然后遍历左节点,最后是右节点;
中序遍历就是先遍历左节点,然后遍历中间的根节点,最后是右节点;
后序遍历就是先遍历左节点,然后遍历是右节点,最后是中间的根节点。
当然要理解这些,需要了解树的基本概念才行。
③ 二叉树遍历该怎样写(计算机二级考试)
前序遍历 是 根左右
中序 是 左根右
后序 是 左右根
都是递归遍历:
1.中序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
(1)中序遍历左子树;
(2)访问根结点;
(3)中序遍历右子树。
2.先序(前序)遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
(1) 访问根结点;
(2) 先序遍历左子树;
(3) 先序遍历右子树。
3.后序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
(1)后序遍历左子树;
(2)后序遍历右子树;
(3)访问根结点
④ 二叉树的遍历
遍历方案
从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:
(1)访问结点本身(N),
(2)遍历该结点的左子树(L),
(3)遍历该结点的右子树(R)。
三种遍历的命名
根据访问结点操作发生位置命名:
① NLR:前序遍历(PreorderTraversal亦称(先序遍历))
——访问结点的操作发生在遍历其左右子树之前。
② LNR:中序遍历(InorderTraversal)
——访问结点的操作发生在遍历其左右子树之中(间)。
③ LRN:后序遍历(PostorderTraversal)
——访问结点的操作发生在遍历其左右子树之后。
注意:
由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。
遍历算法
1.中序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
(1)遍历结点的左子树;
(2)访问当前结点;
(3)遍历结点的右子树。
2.先序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
(1) 访问当前结点;
(2) 遍历结点的左子树;
(3) 遍历结点的右子树。
3.后序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
(1)遍历结点的左子树;
(2)遍历结点的右子树;
(3)访问当前结点。
4.中序遍历的算法实现
用二叉链表做为存储结构,中序遍历算法可描述为:
void InOrder(BinTree T)
{ //算法里①~⑥是为了说明执行过程加入的标号
① if(T) { // 如果二叉树非空
② InOrder(T->lchild);
③ printf("%c",T->data); // 访问结点
④ InOrder(T->rchild);
⑤ }
⑥ } // InOrder
还有什么不明白的请继续追加~
⑤ 求c#前中后序遍历二叉树的算法及思想
下面简单介绍一下几种算法和思路:
先序遍历:
1. 访问根结点
2. 按先序遍历左子树;
3. 按先序遍历右子树;
4. 例如:遍历已知二叉树结果为:A->B->D->G->H->C->E->F
中序遍历:
1. 按中序遍历左子树;
2. 访问根结点;
3. 按中序遍历右子树;
4. 例如遍历已知二叉树的结果:B->G->D->H->A->E->C->F
后序遍历:
1. 按后序遍历左子树;
2. 按后序遍历右子树;
3. 访问根结点;
4. 例如遍历已知二叉树的结果:G->H->D->B->E->F->C->A
层次遍历:
1.从上到下,从左到右遍历二叉树的各个结点(实现时需要借辅助容器);
2.例如遍历已知二叉树的结果:A->B->C->D->E->F->G->H
附加代码:
二叉遍历算法解决方案
using System;
using System.Collections.Generic;
using System.Text;
namespace structure
{
class Program
{
二叉树结点数据结构的定义#region 二叉树结点数据结构的定义
//二叉树结点数据结构包括数据域,左右结点以及父结点成员;
class nodes<T>
{
T data;
nodes<T> Lnode, Rnode, Pnode;
public T Data
{
set { data = value; }
get { return data; }
}
public nodes<T> LNode
{
set { Lnode = value; }
get { return Lnode; }
}
public nodes<T> RNode
{
set { Rnode = value; }
get { return Rnode; }
}
public nodes<T> PNode
{
set { Pnode = value; }
get { return Pnode; }
}
public nodes()
{ }
public nodes(T data)
{
this.data = data;
}
}
#endregion
#region 先序编历二叉树
static void PreOrder<T>(nodes<T> rootNode)
{
if (rootNode != null)
{
Console.WriteLine(rootNode.Data);
PreOrder<T>(rootNode.LNode);
PreOrder<T>(rootNode.RNode);
}
}
#endregion
⑥ 二叉树先序遍历流程图怎么画
首先要搞明白二叉树的几种遍历方法:(1)、先序遍历法:根左右;(2)、中序遍历法:左根右;(3)、后序遍历法:左右根。其中根:表示根节点;左:表示左子树;右:表示右子树。
至于谈到如何画先序遍历的流程图,可以这样考虑:按照递归的算法进行遍历一棵二叉树。
程序首先访问根节点,如果根节点的值为空(NULL),则停止访问;如果根节点的值非空,则递归访问二叉树的左子树(left),然后是依然判断二叉树下面的左子树下面的根节点是否为空(NULL),如果根节点的值为空(NULL),则返回上一层,再访问二叉树的右子树(right)。
依此类推。
⑦ C++中二叉树的前序(后序、中序)遍历分别是什么意思相应的树图怎么看
二叉树的遍历是指按照一定次序访问树中所有结点,并且每个节点仅被访问一次的过程。
1、先序遍历(前序)
(1)访问根节点;
(2)先序遍历左子树;
(3)先序遍历右子树。
2、中序遍历
(1)中序遍历左子树;
(2)访问根节点;
(3)中序遍历右子树。
3、后序遍历
(1)后序遍历左子树;
(2)后序遍历右子树‘
(3)访问根节点。
记住访问根结点的时机就可以区分三种遍历方法了。
同时知道一棵二叉树的先序序列和中序序列,或者同时知道中序序列和后序序列,就能确定这棵二叉树的结构。构造算法相信你已经学习过,在任一本介绍数据结构的书上应该也有描述的。由于涉及到算法细节,这里就不细说了。
下面根据你例子中给出的序列来介绍确定二叉树结构的步骤:
(1)后序序列中最后一个为树的根节点,即c为二叉树的根结点;
(2)中序遍历中根节点把序列分为左右子树的中序遍历序列两个部分,在你的例子在右子树没有中序遍历序列(中序遍历序列中c右边没有序列),故可知二叉树的左子树的后序遍历序列为dabe,中序遍历序列为deba;
(3)应用(1)的方法,确定c的左子树的根结点为e,并把以e为根结点的子树的中序遍历序列划分为d(以e为根结点的左子树的中序遍历序列)和ba(以e为根结点的右子树的中序遍历序列)两个部分,后序遍历序列为dab;
(4)应用(1)的方法,可确定e的左结点为b;
(5)应用(1)的方法,可确定e的右结点为a;
(6)最后,可确定a无左结点,右结点为d。
构造的二叉树如图中所示。
那么可获得前序遍历序列为cedba
⑧ 二叉树的遍历
1.遍历方案 从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作: (1)访问结点本身(N), (2)遍历该结点的左子树(L), (3)遍历该结点的右子树(R)。以上三种操作有六种执行次序: NLR、LNR、LRN、NRL、RNL、RLN。 注意: 前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。 2.三种遍历的命名 根据访问结点操作发生位置命名: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderTraversal) ——访问结点的操作发生在遍历其左右子树之后。 注意: 由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtlee)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。 遍历算法 1.中序遍历的递归算法定义: 若二叉树非空,则依次执行如下操作: (1)遍历左子树; (2)访问根结点; (3)遍历右子树。 2.先序遍历的递归算法定义: 若二叉树非空,则依次执行如下操作: (1) 访问根结点; (2) 遍历左子树; (3) 遍历右子树。 3.后序遍历得递归算法定义: 若二叉树非空,则依次执行如下操作: (1)遍历左子树; (2)遍历右子树; (3)访问根结点。 ~
⑨ 二叉树前序遍历法举例!急急急!!!
二叉树的三种金典遍历法
1.前序遍历法:
前序遍历(DLR)
前序遍历(DLR)
前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。
若二叉树为空则结束返回,否则:
(1)访问根结点
(2)前序遍历左子树
(3)前序遍历右子树
注意的是:遍历左右子树时仍然采用前序遍历方法。
如上图所示二叉树
前序遍历,也叫先根遍历,遍历的顺序是,根,左子树,右子树
遍历结果:ABDECF
中序遍历,也叫中根遍历,顺序是左子树,根,右子树
遍历结果:DBEAFC
后序遍历,也叫后根遍历,遍历顺序,左子树,右子树,根
遍历结果:DEBFCA
2.中序遍历法:
中序遍历
中序遍历(LDR)
中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。在遍历左、右子树时,仍然先遍历左子树,再访问根结点,最后遍历右子树。即:
若二叉树为空则结束返回,否则:
(1)中序遍历左子树
(2)访问根结点
(3)中序遍历右子树。
注意的是:遍历左右子树时仍然采用中序遍历方法。
3.后序遍历法:
后序遍历
简介
后序遍历是二叉树遍历的一种。后序遍历指在访问根结点、遍历左子树与遍历右子树三者中,首先遍历左子树,然后遍历右子树,最后遍历访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点。后序遍历有递归算法和非递归算法两种。
递归算法
算法描述:
(1)若二叉树为空,结束
(2)后序遍历左子树
(3)后序遍历右子树
(4)访问根结点
伪代码
PROCEDUREPOSTRAV(BT)
IFBT<>0THEN
{
POSTRAV(L(BT))
POSTRAV(R(BT))
OUTPUTV(BT)
}
RETURN
c语言描述
structbtnode
{
intd;
structbtnode*lchild;
structbtnode*rchild;
};
voidpostrav(structbtnode*bt)
{
if(bt!=NULL)
{
postrav(bt->lchild);
postrav(bt->rchild);
printf("%d",bt->d);
}
}
非递归算法
算法1(c语言描述):
voidpostrav1(structbtnode*bt)
{
structbtnode*p;
struct
{
structbtnode*pt;
inttag;
}st[MaxSize];
}
inttop=-1;
top++;
st[top].pt=bt;
st[top].tag=1;
while(top>-1)/*栈不为空*/
{
if(st[top].tag==1)/*不能直接访问的情况*/
{
p=st[top].pt;
top--;
if(p!=NULL)
{
top++;/*根结点*/
st[top].pt=p;
st[top].tag=0;
top++;/*右孩子结点*/
st[top].pt=p->p->rchild;
st[top].tag=1;
top++;/*左孩子结点*/
st[top].pt=p->lchild;
st[top].tag=1;
}
}
if(st[top].tag==0)/*直接访问的情况*/
{
printf("%d",st[top].pt->d);
top--;
}
}
}
算法2:
voidpostrav2(structbtnode*bt)
{
structbtnode*st[MaxSize],*p;
intflag,top=-1;
if(bt!=NULL)
{
do
{
while(bt!=NULL)
{
top++;
st[top]=bt;
bt=bt->lchild;
}
p=NULL;
flag=1;
while(top!=-1&&flag)
{
bt=st[top];
if(bt->rchild==p)
{
printf("%d",bt->d);
top--;
p=bt;
}
else
{
bt=bt->rchild;
flag=0;
}
}
}while(top!=-1)
printf(" ");
}
}
老曹回答必属佳作记得给分谢谢合作!
⑩ 写出二叉树的先序遍历、中序遍历、后序遍历。
一、先序遍历:
1、访问根节点
2、前序遍历左子树
3、前序遍历右子树
二、中序遍历:
1、中序遍历左子树
2、访问根节点
3、中序遍历右子树
三、后序遍历:
1、后序遍历左子树
2、后序遍历右子树
3、访问根节点
下面介绍一下例子与方法:
1、画树求法:
第一步,根据前序遍历的特点,我们知道根结点为G
第二步,观察中序遍历ADEFGHMZ。其中root节点G左侧的ADEF必然是root的左子树,G右侧的HMZ必然是root的右子树。
第三步,观察左子树ADEF,左子树的中的根节点必然是大树的root的leftchild。在前序遍历中,大树的root的leftchild位于root之后,所以左子树的根节点为D。
第四步,同样的道理,root的右子树节点HMZ中的根节点也可以通过前序遍历求得。在前序遍历中,一定是先把root和root的所有左子树节点遍历完之后才会遍历右子树,并且遍历的左子树的第一个节点就是左子树的根节点。同理,遍历的右子树的第一个节点就是右子树的根节点。
第五步,观察发现,上面的过程是递归的。先找到当前树的根节点,然后划分为左子树,右子树,然后进入左子树重复上面的过程,然后进入右子树重复上面的过程。最后就可以还原一棵树了。该步递归的过程可以简洁表达如下:
1 确定根,确定左子树,确定右子树。
2 在左子树中递归。
3 在右子树中递归。
4 打印当前根。
那么,我们可以画出这个二叉树的形状:
那么,根据后序的遍历规则,我们可以知道,后序遍历顺序为:AEFDHZMG