• 二叉树的层次访问


    #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);
    }
    


  • 相关阅读:
    ajax优缺点及用法
    通俗易懂:窗口函数 | 全是案例
    mysql基本数据类型
    Elasticsearch从入门到专家
    shell数组实和变量扩展实现keyvalue设计
    catboost学习笔记
    pacman总结
    常用archlinux软件索引
    Linux配置打印机
    记录一次实战GetShell
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3089290.html
Copyright © 2020-2023  润新知