二叉树的三种遍历算法
⑴ 关于二叉树的三种遍历
先序
preOrder(BiTree T)
{
if(T)
{
visitor(T);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
中序
inOrder(BiTree T)
{
if(T)
{
preOrder(T->lchild);
visitor(T);
preOrder(T->rchild);
}
}
后序
preOrder(BiTree T)
{
if(T)
{
preOrder(T->lchild);
preOrder(T->rchild);
visitor(T);
}
}
数据机构丢下太久了,基本不会了,只记得三种遍历了,估计也帮不了你咯... 还有,最好翻成中文发出来,因为有的人即便会,看到英文的怕麻烦也不会回答了....
⑵ 二叉树算法
二叉树的算法主要分为三种:先序遍历,中序遍历和后序遍历。二叉树(Binary Tree)是n(n>=0)个节点的有限集合,该集合或者空集(称为空二叉树),或者由一个根节点和两棵互不相交的,分别称为根节点的左子树和右子树的二叉树组成。(2)二叉树的三种遍历算法扩展阅读
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的'子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^(i 1)个结点;深度为k的二叉树至多有2^k 1个结点;对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0 = n2 + 1。二叉树算法常被用于实现二叉查找树和二叉堆。
概念
编辑 语音
二叉树是每个节点最多有两个子树的有序树。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
基本形态:
二叉树也是递归定义的,其结点有左右子树之分,逻辑上二叉树算法有五种基本形态:
(1)空二叉树——(a)
(2)只有一个根结点的二叉树——(b);
(3)右子树为空的二叉树——(c);
(4)左子树为空的二叉树——(d);
(5)完全二叉树——(e)
注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。
⑶ 按照二叉树的递归定义,对二叉树遍历的常用算法有哪三种
前序遍历,中序遍历,后序遍历。
⑷ 二叉树遍历方法有几种
二叉树遍历方法最常用的大致有四种:
先序遍历,也叫先根遍历。就是先访问根结点,再访问左子树,最后访问右子树。
中序遍历,也叫中根遍历。就是先访问左子树,再访问根节点,最后访问右子树。
后序遍历,也叫后根遍历。就是先访问左子树,再访问右子树,最后访问根结点。
按层次遍历,就是对二叉树从上到下访问每一层,在每一层中都是按从左到右进行访问该层中的每一个节点。
⑸ c++二叉树的几种遍历算法
遍历二叉树的所有结点且仅访问一次。按照根节点位置的不同分为前序遍历,中序遍历,后序遍历(除此之外还有层次遍历,但不常用,此处不做解释)。
1.前序遍历:根节点->左子树->右子树(根节点在前面)。
2.中序遍历:左子树->根节点->右子树(根节点在中间)。
3.后序遍历:左子树->右子树->根节点(根节点在后边)。
例如:求下面树的三种遍历:
前序遍历:abdefgc;
中序遍历:debgfac;
后序遍历:edgfbca。
⑹ 二叉树的遍历算法
这里有二叉树先序、中序、后序三种遍历的非递归算法,此三个算法可视为标准算法。
1.先序遍历非递归算法
#define
maxsize
100
typedef
struct
{
Bitree
Elem[maxsize];
int
top;
}SqStack;
void
PreOrderUnrec(Bitree
t)
{
SqStack
s;
StackInit(s);
p=t;
while
(p!=null
||
!StackEmpty(s))
{
while
(p!=null)
//遍历左子树
{
visite(p->data);
push(s,p);
p=p->lchild;
}//endwhile
if
(!StackEmpty(s))
//通过下一次循环中的内嵌while实现右子树遍历
{
p=pop(s);
p=p->rchild;
}//endif
}//endwhile
}//PreOrderUnrec
2.中序遍历非递归算法
#define
maxsize
100
typedef
struct
{
Bitree
Elem[maxsize];
int
top;
}SqStack;
void
InOrderUnrec(Bitree
t)
{
SqStack
s;
StackInit(s);
p=t;
while
(p!=null
||
!StackEmpty(s))
{
while
(p!=null)
//遍历左子树
{
push(s,p);
p=p->lchild;
}//endwhile
if
(!StackEmpty(s))
{
p=pop(s);
visite(p->data);
//访问根结点
p=p->rchild;
//通过下一次循环实现右子树遍历
}//endif
}//endwhile
}//InOrderUnrec
3.后序遍历非递归算法
#define
maxsize
100
typedef
enum{L,R}
tagtype;
typedef
struct
{
Bitree
ptr;
tagtype
tag;
}stacknode;
typedef
struct
{
stacknode
Elem[maxsize];
int
top;
}SqStack;
void
PostOrderUnrec(Bitree
t)
{
SqStack
s;
stacknode
x;
StackInit(s);
p=t;
do
{
while
(p!=null)
//遍历左子树
{
x.ptr
=
p;
x.tag
=
L;
//标记为左子树
push(s,x);
p=p->lchild;
}
while
(!StackEmpty(s)
&&
s.Elem[s.top].tag==R)
{
x
=
pop(s);
p
=
x.ptr;
visite(p->data);
//tag为R,表示右子树访问完毕,故访问根结点
}
if
(!StackEmpty(s))
{
s.Elem[s.top].tag
=R;
//遍历右子树
p=s.Elem[s.top].ptr->rchild;
}
}while
(!StackEmpty(s));
}//PostOrderUnrec