数据结构 二叉树遍历
来源:互联网 发布:美国网络课程 编辑:程序博客网 时间:2024/05/10 17:19
/*################# Preorder Traverse begin ###################################################################*/
先序遍历:
1递归算法
void PreorderTraverse(BTNode *T)
{
if (T!=NULL)
{
visit(T->data) ; /* 访问根结点 */
PreorderTraverse(T->Lchild) ;
PreorderTraverse(T->Rchild) ;
}
}
2 非递归算法
设T是指向二叉树根结点的指针变量,非递归算法是:
若二叉树为空,则返回;否则,令p=T;
⑴ 访问p所指向的结点;
⑵ q=p->Rchild ,若q不为空,则q进栈;
⑶ p=p->Lchild ,若p不为空,转(1),否则转(4);
⑷ 退栈到p ,转(1),直到栈空为止。
算法实现:
#define MAX_NODE 50
void PreorderTraverse( BTNode *T)
{
BTNode *Stack[MAX_NODE] ,*p=T, *q ;
int top=0 ;
if (T==NULL) printf(“ Binary Tree is Empty!\n”) ;
else
{
do
{
visit( p-> data ) ;
q=p->Rchild ;
if ( q!=NULL )
{
stack[++top]=q ;
}
p=p->Lchild;
if (p==NULL)
{
p=stack[top] ;
top-- ;
}
}
while (p!=NULL) ;
}
}
/*################# Preorder Traverse end ###################################################################*/
/*################# InorderTraverse begin ###################################################################*/
递归算法:
void InorderTraverse(BTNode *T)
{
if(T!=NULL)
{
InorderTraverse(T->Lchild) ;
visit(T->data) ; /* 访问根结点 */
InorderTraverse(T->Rchild) ;
}
}
2 非递归算法
设T是指向二叉树根结点的指针变量,非递归算法是:
若二叉树为空,则返回;否则,令p=T
⑴ 若p不为空,p进栈, p=p->Lchild ;
⑵ 否则(即p为空),退栈到p,访问p所指向的结点;
⑶ p=p->Rchild ,转(1);
直到栈空为止。
算法实现:
#define MAX_NODE 50
void InorderTraverse( BTNode *T)
{
BTNode *Stack[MAX_NODE] ,*p=T ;
int top=0 , bool=1 ;
if(T==NULL) printf(“ Binary Tree is Empty!\n”) ;
else
{
do
{
while (p!=NULL)
{
stack[++top]=p ;
p=p->Lchild ;
}
if (top==0)
{
bool=0 ;
}
else
{
p=stack[top] ;
top-- ;
visit( p->data ) ;
p=p->Rchild ;
}
} while (bool!=0) ;
}
}
/*################# InorderTraverse end ###################################################################*/
/*################# PostorderTraverse begin ###################################################################*/
后续遍历:
设T是指向根结点的指针变量,非递归算法是:
若二叉树为空,则返回;否则,令p=T;
⑴ 第一次经过根结点p,不访问:
p进栈S1 , tag 赋值0,进栈S2,p=p->Lchild 。
⑵ 若p不为空,转(1),否则,取状态标志值tag :
⑶ 若tag=0:对栈S1,不访问,不出栈;修改S2栈顶元素值(tag赋值1) ,取S1栈顶元素的右子树,即p=S1[top]->Rchild ,转(1);
⑷ 若tag=1:S1退栈,访问该结点;
直到栈空为止。
算法实现:
#define MAX_NODE 50
void PostorderTraverse( BTNode *T)
{
BTNode *S1[MAX_NODE] ,*p=T ;
int S2[MAX_NODE] , top=0 , bool=1 ;
if (T==NULL)
{
printf(“Binary Tree is Empty!\n”) ;
}
else
{
do
{
while (p!=NULL)
{
S1[++top]=p ; S2[top]=0 ;
p=p->Lchild ;
}
if (top==0)
{
bool=0 ;
}
else if(S2[top]==0)
{
p=S1[top]->Rchild ; S2[top]=1 ;
}
else
{
p=S1[top] ; top-- ;
visit( p->data ) ; p=NULL ;
/* 使循环继续进行而不至于死循环 */
}
} while (bool!=0) ;
}
}
/*################# PostorderTraverse end ###################################################################*/
- 二叉树遍历 - 数据结构
- 数据结构 二叉树遍历
- 数据结构 - 二叉树遍历
- 二叉树遍历 - 数据结构
- 数据结构--二叉树遍历
- 【数据结构】二叉树遍历
- 数据结构-二叉树遍历
- 数据结构--遍历二叉树
- 数据结构二叉树遍历
- 数据结构二叉树遍历
- 数据结构 二叉树 创建 遍历
- 数据结构之二叉树遍历
- 数据结构 - 二叉树的遍历
- 数据结构-----二叉树的遍历
- 数据结构----二叉树的遍历
- 数据结构--二叉树遍历问题
- 数据结构 二叉树的遍历
- 数据结构-->二叉树遍历应用
- 内核中的物理内存分配函数kernel api分析----kmalloc实现
- android listView 点击无响应的解决办法
- 题目36:二叉搜索树
- rsync初试
- Multiprocess programming - Lower Bounds on the Number of Locations
- 数据结构 二叉树遍历
- html解析器工作原理
- javaMail简介
- Acess中GetRecordCount()返回-1问题
- 题目37:还是A+B
- 黑马程序员-Winform基础-学习笔记
- 更新Android源码
- 获取java native函数signature的快捷方法--javap工具
- 解决ListView图标图像效果失真