百度首页 | 百度空间
 
查看文章
 
二叉树的递归遍历及其应用
2008-05-14 15:31
实验六:二叉树的递归遍历及其应用
题目:假设二叉树采用二叉链表结构。设计并实现如下算法:后序递归建树,先序非递归遍历该树,输出各个节点的值,并求该树中单分支节点的个数。

代码(TC下编译通过):


#include <stdio.h>
#include <stdlib.h>

#define TRUE            1
#define FALSE           0
#define OK              1
#define ERROR           0
#define INFEASIBLE        -1
#define OVERFLOW        -2


typedef int Status;
typedef char TElemType;/*数据类型*/

typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild,*rchild; /*左右孩子指针*/
}BiTNode,/*二叉链表节点*/
*BiTree;/*二叉树*/

/********部分基本操作的函数原型********/
Status CreateBiTree(BiTree *T);
Status PreOrderTraverse(BiTree T, Status (*visit)(TElemType e));

Status operate(TElemType e);

/*********************栈**********************/
typedef BiTNode SqStackElemType;

typedef struct
{
int top,base,count;
SqStackElemType container[100];/*ROW*COLUM];*/
}SqStack;

Status InitStack(SqStack *s);
Status StackEmpty(SqStack s);
Status Push(SqStack *s,SqStackElemType e);
Status Pop(SqStack *s,SqStackElemType *e);

/********栈的部分操作定义**********/

Status InitStack(SqStack *s)
{
s->top=-1;
s->base=0;
s->count=0;
}

Status StackEmpty(SqStack s)
{
if(s.count!=0)
{return FALSE;}
return TRUE;
}

Status Push(SqStack *s,SqStackElemType e)
{
s->top++;
s->container[s->top]=e;
s->count++;
return OK;
}

Status Pop(SqStack *s,SqStackElemType *e)
{
if(s->top<s->base)
{return ERROR;}
*e = s->container[s->top];
s->top--;
s->count--;
}
/*********************END栈**********************/

/********部分基本操作的函数定义********/

Status CreateBiTree(BiTree *T)/*后序递归建树*/
{
    TElemType e;
    /*scanf("%c",e);*/
    e=getchar();

    if(e=='#'||e=='\n')
    {
        *T = 0;
    }
    else
    {
        if((*T)=(BiTNode*)malloc(sizeof(BiTNode)))
        {
            (*T)->lchild = 0;
            (*T)->rchild = 0;
        }
        else
        {exit(OVERFLOW);}
       
        CreateBiTree(&((*T)->lchild));
        CreateBiTree(&((*T)->rchild));

        (*T)->data = e;

   
    }
    return OK;
}

Status PreOrderTraverse(BiTree T, Status (*visit)(TElemType e))/*先序非递归遍历*/
{
    BiTNode btn;
    SqStack ss;
   
    int count=0;/*特殊变量,用于记录单分支节点个数*/

    InitStack(&ss);
    if(T)
    {
        Push(&ss,*T);

        for(;!StackEmpty(ss);)
        {
            Pop(&ss,&btn);
            (*visit)(btn.data);

            if(btn.rchild)
            {
                Push(&ss,*btn.rchild);
            }
            if(btn.lchild)
            {
                Push(&ss,*btn.lchild);
            }
           
            if((!(btn.rchild&&btn.lchild))&&(btn.rchild||btn.lchild))/*特殊,记录单分支节点个数*/
            {count++;}
        }
    }
    printf("\n%d",count);/*特殊,输出单分支节点个数*/
   
    return OK;
}

Status operate(TElemType e)
{
    printf("%5c",e);
    return OK;
}

/*********main 函数*********/
main()
{
    BiTree bt;
    clrscr();
    CreateBiTree(&bt);
    PreOrderTraverse(bt,operate);
}

类别:c语言 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu