zoukankan      html  css  js  c++  java
  • 二叉树的层次访问

    #include<stdio.h>
    #include<stdlib.h>
    
    #define OVERFLOW -1
    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0
    
    typedef int status;
    typedef char TElemType;
    typedef struct TNode{
    	TElemType data;
    	struct TNode *lchild,*rchild;
    }BNode,*BTree;
    typedef BTree QElemType; //队列元素类型,即二叉树根指针类型
    
    typedef struct QNode{//队列结点类型
    	QElemType data;
    	struct QNode *next;
    }QNode,*QLink;
    typedef struct{//队列类型
    	QLink front,rear;
    }Queue;
    
    /*      队列的基本操作     */
    //初始化一个空队列
    status InitQueue(Queue &Q)
    {
    	Q.front=Q.rear=(QLink)malloc(sizeof(QNode));
    	if(!Q.front) exit(OVERFLOW);
    	Q.front->next=NULL;
    	return OK;
    }
    
    //元素e入队
    void InQueue(Queue &Q,QElemType e)
    {
    	QLink s;
    	s=(QLink)malloc(sizeof(QNode));
    	if(!s) exit(OVERFLOW);
    	s->data=e;
    	s->next=NULL;
    	Q.rear->next=s;
    	Q.rear=s;
    }
    
    //出队,用e返回值
    status OutQueue(Queue &Q,QElemType &e)
    {
    	QLink p;
    	if(Q.front==Q.rear) return ERROR;
    	p=Q.front->next;
    	e=p->data;
    	Q.front->next=p->next;
    	if(p==Q.rear) Q.rear=Q.front;
    	free(p);
    	return OK;
    }
    
    //判断队空,若空,返回OK
    status EmptyQueue(Queue Q)
    {
    	if(Q.front==Q.rear) return TRUE;
    	else return FALSE;
    }
    
    //创建二叉树	 
    status creat(BTree &t) 
    {
    	char ch;
    	ch=getchar();
    	if(ch==' ') t=NULL;
    	else{
    		t=(BTree)malloc(sizeof(BNode));
    		if(!t) exit(OVERFLOW);
    		t->data=ch;
    		creat(t->lchild);
    		creat(t->rchild);
    	}
    	return OK;
    }
    
    //先序访问
    void DLR(BTree t)
    {
    	if(t){
    		printf("%c",t->data);
    		DLR(t->lchild);
    		DLR(t->rchild);
    	}
    }
    
    //层次访问
    void Level(BTree t)
    {   //层次遍历
    	BTree p;
    	Queue Q;
    	InitQueue(Q);//初始化一个队列
    	p=t;//p指向树根
    	if(!p) return;//空树,返回
    	InQueue(Q,p) ;//非空根指针入队
    	while(!EmptyQueue(Q))//当队列不空时
    	{
    		OutQueue(Q,p);//出队一个元素给p
    		printf("%c",p->data);//输出值
    		if(p->lchild) InQueue(Q,p->lchild);//若有左孩子,左孩子入队
    		if(p->rchild) InQueue(Q,p->rchild);//若有有孩子,右孩子入队
    	}
    }
    
    
    void main()
    {
    	BTree t=NULL;
        printf("创建二叉树,空格代表空树\n");
    	creat(t);
    	printf("建立成功\n");
    	printf("先序遍历的结果为:\n");
    	DLR(t);
    	printf("\n层次遍历的结果为:");
    	Level(t);
    }
    


  • 相关阅读:
    c# 基础连接已经关闭: 连接被意外关闭,错误的解决
    关于SSIS中代码页(Code Page) 相关错误
    WinAPI: CopyFileEx
    RegularExpressions(5) RegularExpressions 成员(二) IRegex
    RegularExpressions(4) RegularExpressions 成员(一)
    RegularExpressions(3) RegularExpressions 的工作思路
    一句话复制整个文件夹(当然包括嵌套文件夹) 回复 "张哆哆" 的问题
    有趣的 TBitBtn.Kind
    如何用 GDI+ 高质量地缩放图片 回复 "程序牛" 的问题
    如何用 GDI 绘制阴影文字 回复 "Splendour" 的问题
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3089290.html
Copyright © 2011-2022 走看看