树的遍历
2015-10-30 20:49
441 查看
包含树的前序遍历、中序遍历、后序遍历和层次遍历,提供了递归和非递归方法:
/*****递归***/
void PreOrder(BiTree T){
if (NULL != T)
{
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void InOrder(BiTree T){
if (NULL != T)
{
PreOrder(T->lchild);
visit(T);
PreOrder(T->rchild);
}
}
void PostOrder(BiTree T){
if (NULL != T)
{
PreOrder(T->lchild);
PreOrder(T->rchild);
visit(T);
}
}
/*****非递归***/
void InOrder(BiTree T){
BiTree p = T;
while(p||!IsEmpty(s)){ //结束条件为栈空
if (p) //一直往左走直至为空,边走边入栈
{
Push(S,p);
p = p->lchild;
}else{ //若左子树为空则访问当前节点
Pop(s,p);
visit(p);
p = p->rchild;
}
}
}
void PreOrder(BiTree T){
BiTree p = T;
while(p||!IsEmpty(s)){ //结束条件为栈空
if (p) //一直往左走直至为空,边走边访问并入栈
{
visit(p);
Push(S,p);
p = p->lchild;
}else
{ //左子树为空访问右子树
Pop(s,p);
p = p->rchild;
}
}
}
void PostOrder(BiTree T){
p = T;
preNode = NULL; //指向前一个被访问的节点
while(p || !IsEmpty(s)){
while(p){ //一直往左走直至为空
Push(S,p);
p = p->lchild;
}
Pop(S,p);
if (NULL == p->rchild || preNode == p->rchild) //若左右子树都为空或左子树为空,而右子树已经被访问,则访问当前节点
{
visit(p);
preNode = p;
p = NULL;
}else{
p = p->rchild;
}
}
}
void LevelOrder(BiTree T){
InitQuere(Q);
BiTree p;
EnQueue(Q, T);
while (!IsEmpty(Q)){
DeQueue(Q,p);
visit(p);
if (NULL != p->lchild)
EnQueue(Q,p->lchild);
if (NULL != p->rchild)
EnQueue(Q,p->rchild);
}
}
int Btdepth(BiTree T){ //求树的深度
if (NULL == T)
return 0;
ldep = Btdepth(T->lchild);
rdep = Btdepth(T->rchild);
return ldep > rdep ? ldep+1 : rdep +1; //从叶子节点每次返回加1
}
/*****递归***/
void PreOrder(BiTree T){
if (NULL != T)
{
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void InOrder(BiTree T){
if (NULL != T)
{
PreOrder(T->lchild);
visit(T);
PreOrder(T->rchild);
}
}
void PostOrder(BiTree T){
if (NULL != T)
{
PreOrder(T->lchild);
PreOrder(T->rchild);
visit(T);
}
}
/*****非递归***/
void InOrder(BiTree T){
BiTree p = T;
while(p||!IsEmpty(s)){ //结束条件为栈空
if (p) //一直往左走直至为空,边走边入栈
{
Push(S,p);
p = p->lchild;
}else{ //若左子树为空则访问当前节点
Pop(s,p);
visit(p);
p = p->rchild;
}
}
}
void PreOrder(BiTree T){
BiTree p = T;
while(p||!IsEmpty(s)){ //结束条件为栈空
if (p) //一直往左走直至为空,边走边访问并入栈
{
visit(p);
Push(S,p);
p = p->lchild;
}else
{ //左子树为空访问右子树
Pop(s,p);
p = p->rchild;
}
}
}
void PostOrder(BiTree T){
p = T;
preNode = NULL; //指向前一个被访问的节点
while(p || !IsEmpty(s)){
while(p){ //一直往左走直至为空
Push(S,p);
p = p->lchild;
}
Pop(S,p);
if (NULL == p->rchild || preNode == p->rchild) //若左右子树都为空或左子树为空,而右子树已经被访问,则访问当前节点
{
visit(p);
preNode = p;
p = NULL;
}else{
p = p->rchild;
}
}
}
void LevelOrder(BiTree T){
InitQuere(Q);
BiTree p;
EnQueue(Q, T);
while (!IsEmpty(Q)){
DeQueue(Q,p);
visit(p);
if (NULL != p->lchild)
EnQueue(Q,p->lchild);
if (NULL != p->rchild)
EnQueue(Q,p->rchild);
}
}
int Btdepth(BiTree T){ //求树的深度
if (NULL == T)
return 0;
ldep = Btdepth(T->lchild);
rdep = Btdepth(T->rchild);
return ldep > rdep ? ldep+1 : rdep +1; //从叶子节点每次返回加1
}
相关文章推荐
- 文件遍历排序函数
- Lua 学习笔记之C API 遍历 Table实现代码
- Lua和C语言的交互详解
- 有关数据库SQL递归查询在不同数据库中的实现方法
- C#中的递归APS和CPS模式详解
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#中遍历Hashtable的4种方法
- WinForm实现按名称递归查找控件的方法
- C#中的尾递归与Continuation详解
- Erlang中遍历取出某个位置的最大值代码
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结