欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

采用二叉链表结构实现二叉树,并以递归遍历思想实现二叉树的创建、二叉树的遍历(先序、中序、后序和层次遍历)

程序员文章站 2022-05-06 21:29:52
...

采用二叉链表结构实现二叉树,并以递归遍历思想实现二叉树的创建、二叉树的遍历(先序、中序、后序和层次遍历)、二叉树叶子节点统计、二叉树深度统计的算法;同时,结合课件和实例代码,实现二叉树的中序非递归遍历算法。存储结构和操作接口定义如下:

/*①二叉树的二叉链表存储结构定义*/

typedef struct BiTNode

{

ElemType data;

struct BiTNode *lchild,*rchild;      //左右孩子指针

}BiTNode,*BiTree;

 

/*②二叉树操作接口定义*/

//1-创建二叉树

//按先序次序输入二叉树中结点的值(一个字符),#字符表示空树,

BiTree CreateBiTree(BiTree &T);

//1-创建二叉树

//按先序次序输入二叉树中结点的值(一个字符),#字符表示空树

BiTree CreateBiTree(BiTree &T);

//2-先序遍历二叉树(递归算法)

//先序遍历二叉树T的递归算法,对每个数据元素调用函数Visit

Status PreOrderTraverse( BiTree T, Status(*Visit)(ElemType) );

//3-中序遍历二叉树(递归算法)

//中序遍历二叉树T的递归算法,对每个数据元素调用函数Visit

Status InOrderTraverse( BiTree T, Status(*Visit)(ElemType) );

//4-后序遍历二叉树(递归算法)

//后序遍历二叉树T的递归算法,对每个数据元素调用函数Visit

Status PostOrderTraverse( BiTree T, Status(*Visit)(ElemType) );

//5-中序遍历二叉树(非递归算法)

//中序遍历二叉树T的递归算法,对每个数据元素调用函数Visit,非递归算法,

//采用栈作为辅助结构,注意栈中存储的数据类型是指向树结点的指针

Status InOrderTraverse1( BiTree T, Status(*Visit)(ElemType) );

//6-层次遍历二叉树

//层次遍历二叉树T的递归算法,对每个数据元素调用函数Visit,采用队列作为辅助结构

Status LevelOrderTraverse( BiTree T, Status(*Visit)(ElemType) );

//7-统计树的叶子结点个数

Status CountLeafs(BiTree T,int &numofleafs)

//8-统计树的层次数

int CountLevels(BiTree T)


#include<stdlib.h>
#include<stdio.h>
#define TRUE   1
#define FALSE  0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef  int Status;
typedef  char ElemType;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
/*①二叉树的二叉链表存储结构定义*/
typedef struct BiTNode
{
	ElemType data;
	struct BiTNode *lchild,*rchild;      //左右孩子指针
}BiTNode,*BiTree;

/*栈的顺序存储结构定义*/
typedef BiTree SElemType;
typedef struct 
{
	SElemType  *base ;
	SElemType  *top ; 
	int  stacksize ;    
}SqStack; 


//1-创建二叉树
//按先序次序输入二叉树中结点的值(一个字符),#字符表示空树
Status CreateBiTree(BiTree &T);
//2-先序遍历二叉树(递归算法)
//先序遍历二叉树T的递归算法,对每个数据元素调用函数Visit
Status PreOrderTraverse( BiTree T, Status(*Visit)(ElemType e) );
//3-中序遍历二叉树(递归算法)
//中序遍历二叉树T的递归算法,对每个数据元素调用函数Visit
Status InOrderTraverse( BiTree T, Status(*Visit)(ElemType) );
//4-后序遍历二叉树(递归算法)
//后序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
Status PostOrderTraverse( BiTree T, Status(*Visit)(ElemType) );
//5-中序遍历二叉树(非递归算法)
//中序遍历二叉树T的递归算法,对每个数据元素调用函数Visit,非递归算法,
//采用栈作为辅助结构,注意栈中存储的数据类型是指向树结点的指针
Status InOrderTraverse1( BiTree T, Status(*Visit)(ElemType) );
//6-层次遍历二叉树
//层次遍历二叉树T的递归算法,对每个数据元素调用函数Visit,采用队列作为辅助结构
Status LevelOrderTraverse( BiTree T, Status(*Visit)(ElemType) );
//7-统计树的叶子结点个数
Status CountLeafs(BiTree T,int &numofleafs);
//8-统计树的层次数
Status CountLevels(BiTree T);
//打印元素
Status PrintElement(BiTree T);
//构造一个空栈
Status InitStack(SqStack &S);
//进栈
Status Push( SqStack &S, SElemType e );
//退栈
Status Pop(SqStack &S, SElemType &e);
//判断栈是否为空
Status StackEmpty(SqStack S);

// 按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树,
  // 构造二叉链表表示的二叉树T。
Status CreateBiTree(BiTree &T)
{  
  ElemType ch;
  ch=getchar();
  if (ch==' ') T = NULL;
  else 
  {
	  
    if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))  exit(OVERFLOW);
    T->data = ch;              // 生成根结点
    CreateBiTree(T->lchild);      // 构造左子树
    CreateBiTree(T->rchild);      // 构造右子树
  }
  return OK;
} // CreateBiTree


//打印元素
Status PrintElement(ElemType e)
{
	printf("%c ",e);
	return OK;
}

//2-先序遍历二叉树(递归算法)
//先序遍历二叉树T的递归算法,对每个数据元素调用函数Visit
Status PreOrderTraverse( BiTree T, Status(*Visit)(ElemType e) )
{
	if(T)
	{
		if(Visit(T->data)) 
			if(PreOrderTraverse(T->lchild,Visit))
				if(PreOrderTraverse(T->rchild,Visit)) return OK;				
		return ERROR;
	}
	else return OK;
}//PreOrderTraverse



//3-中序遍历二叉树(递归算法)
//中序遍历二叉树T的递归算法,对每个数据元素调用函数Visit
Status InOrderTraverse( BiTree T, Status(*Visit)(ElemType) )
{
	if(T)
	{ 
		if(InOrderTraverse(T->lchild,Visit))
        	if(Visit(T->data)) 
				if(InOrderTraverse(T->rchild,Visit))
					return OK;
		return ERROR;
	}else return OK;
}//PreOrderTraverse


//4-后序遍历二叉树(递归算法)
//后序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
Status PostOrderTraverse( BiTree T, Status(*Visit)(ElemType) )
{
	if(T)
	{
		if(PostOrderTraverse(T->lchild,Visit))
			if(PostOrderTraverse(T->rchild,Visit))
				if(Visit(T->data))  return OK;					
		return ERROR;
	}else return OK;
}//PreOrderTraverse


//构造一个空栈
Status InitStack(SqStack &S)
{
 S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
 if (!S.base){
  printf("栈溢出!\n");
  exit(OVERFLOW);
 }
 S.top = S.base;
 S.stacksize = STACK_INIT_SIZE;
 return OK;
}

//进栈
Status Push(SqStack &S, SElemType e)
{
	if (S.top - S.base >= S.stacksize)
	{
		S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
        if (!S.base)
		{
			printf("栈溢出!\n");
            return OVERFLOW;
		}
     S.top = S.base + S.stacksize;
     S.stacksize += STACKINCREMENT;
	}//若栈满,追加存储空间
    *S.top++ = e;
    return OK;
}

//出栈
Status Pop(SqStack &S, SElemType &e)
{
	if (StackEmpty(S))
		return ERROR; //判空
        e = *(--S.top);
    return OK;
}

//判断栈是否为空
Status StackEmpty(SqStack S)
{
	if( S.top == S.base )
		return TRUE;
	else
		return FALSE;
 }



//5-中序遍历二叉树(非递归算法)
//中序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit,
//采用栈作为辅助结构,注意栈中存储的数据类型是指向树结点的指针
Status InOrderTraverse1( BiTree T, Status(*Visit)(ElemType) )
{
    SqStack S;
    BiTree p;
	p=T;
	InitStack(S);
	while (p || !StackEmpty(S)) 
	{
		if (p) { Push(S,p);  p=p->lchild; }  // 非空指针进栈,继续左进
        else {       // 上层指针退栈,访问其所指结点,再向右进
              Pop(S,p);  
              if(!Visit(p->data))
				return ERROR;
              p = p->rchild;
    }
  }
  return OK;
} // InOrderTraverse



//6-层次遍历二叉树
//层次遍历二叉树T的递归算法,对每个数据元素调用函数Visit,采用队列作为辅助结构
Status LevelOrderTraverse( BiTree T, Status(*Visit)(ElemType) )
{ 
	BiTNode  *Queue[100] ,*p=T ;
               int  front=0 , rear=0 ;
               if (p!=NULL) 
	{  
	       Queue[++rear]=p;    /*   根结点入队  */
                    while (front<rear)
	   {  
		   p=Queue[++front];  Visit( p->data );
		   if (p->lchild!=NULL)
			   Queue[++rear]=p->lchild;    /*   左结点入队  */
		   if (p->rchild!=NULL)
			   Queue[++rear]=p->rchild;    /*   左结点入队  */
	   }
	   return OK;
	}
	return ERROR;
}



//7-统计树的叶子结点个数
Status CountLeafs(BiTree T,int &numofleafs)
{
	if (T) 
   {
      if (T->lchild==NULL&&T->rchild==NULL) numofleafs++;
      CountLeafs(T->lchild,numofleafs); 
      CountLeafs(T->rchild,numofleafs); 
      return OK;
   } 
   else 
	   return ERROR;
}


//8-统计树的层次数
Status CountLevels(BiTree T)
{
   int levelsoflchild=0;
   int levelsofrchild=0;
   if (T) 
   { 
        levelsoflchild=CountLevels(T->lchild);
        levelsofrchild=CountLevels(T->rchild);
        if(levelsoflchild>levelsofrchild)
		  return 1+levelsoflchild;
            else return 1+levelsofrchild;
	}
    else   return 0;
}


void main()
{
	BiTree T;
	int n=0;
	printf("按先序次序输入二叉树中结点的值(一个字符),空格结束:\n");
	CreateBiTree(T);
	CountLeafs(T,n);
	printf("树的叶子结点个数为:%d",n);
    printf("\n树的层次数为:%d\n",CountLevels(T));
    printf("先序遍历二叉树(递归算法):");
	PreOrderTraverse(T,PrintElement);
    printf("\n中序遍历二叉树(递归算法):");
	InOrderTraverse(T,PrintElement);
	printf("\n后序遍历二叉树(递归算法):");
    PostOrderTraverse(T,PrintElement);
	printf("\n中序遍历二叉树(非递归算法):");
    InOrderTraverse1(T,PrintElement);
	printf("\n层次遍历二叉树(递归算法):");
    LevelOrderTraverse(T,PrintElement);
	printf("\n");
}

采用二叉链表结构实现二叉树,并以递归遍历思想实现二叉树的创建、二叉树的遍历(先序、中序、后序和层次遍历)