程序员日记三号——二叉树
来源:互联网 发布:歌词 知乎 编辑:程序博客网 时间:2024/05/17 01:57
#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAX 100typedef char DataType;typedef struct Node{DataType data;struct Node *Lchild,*Rchild;}BiTNode,*BiTree;typedef struct {BiTree data[MAX];int rear,front;}SeQueue;typedef struct{BiTree data[MAX];int top;}SeqStack;int Count=0;int depth=0;void CreateBiTree(BiTree *root);//建立二叉树;void Destory(BiTree *root);//销毁二叉树;void TreeDepth(BiTree root,int h);//求树的高度;BiTree Parent(BiTree root ,DataType current);//求二叉树的双亲结点;BiTree LeftChild(BiTree root,DataType x);//求左孩子结点;BiTree RightChild(BiTree root,DataType x);//求右孩子结点;void PreOrder(BiTree root);//先序遍历操作;void InOrder(BiTree root);//中序遍历操作;void PostOrder(BiTree root);//后序遍历操作;void LevelOrder(BiTree root);//层次遍历操作;void PreOrderCount(BiTree root);//先序遍历统计叶子结点的结点数;void InOrderPrint(BiTree root);//中序遍历输出叶子结点;void PrintTree(BiTree root,int h);//按树状打印二叉树;/*建立并初始化栈*/SeqStack * InitStack(){SeqStack *s;s=(SeqStack *)malloc(sizeof(SeqStack));s->top=-1;return s;}/*判空栈*/int IsEmpty(SeqStack *s){if(s->top==-1)return 1;else return 0;}/*入栈*/int Push(SeqStack *s,BiTree x){if(s->top==MAX-1) return 0;else{s->top++;s->data[s->top]=x;return 1;}}/*出栈*/int Pop(SeqStack *s,BiTree *x){ if(IsEmpty(s)) return 0;else{ *x=s->data[s->top]; s->top--; return 1;}}/*取栈顶元素*/void Top(SeqStack *s,BiTree *x){if(IsEmpty(s))return ;else*x=s->data[s->top];}SeQueue * InitQueue()//初始化队列;{ SeQueue *q; q=(SeQueue *)malloc(sizeof(SeQueue)); q->front=q->rear=0; return q;}int EmptyQueue(SeQueue *q)//判空队;{if(q==NULL||q->rear==0)return 0;else return 1;}void EnterQueue(SeQueue *q,BiTree x)//入队;{if(q->rear==0){q->front=1;q->rear++;}else q->rear++;q->data[q->rear]=x;}void DeleteQueue(SeQueue *q,BiTree *p)//出队;{int i;if(EmptyQueue(q)){ *p=q->data[q->front]; for(i=1;i<=q->rear;i++){ q->data[i]=q->data[i+1];} q->rear--;}else return;}Visit(DataType x){printf("%c",x);}void Initiate(BiTree root) //初始化二叉树;{root=NULL;}void CreateBiTree(BiTree *root)//扩展先序遍历序列建立二叉树;{char ch[2];scanf("%1s",&ch[0]);if(strcmp(ch,"#")==0) *root=NULL;else{ *root=(BiTNode *)malloc(sizeof(BiTNode));(*root)->data=ch[0]; CreateBiTree(&((*root)->Lchild));CreateBiTree(&((*root)->Rchild));}}void Destory(BiTree *root)//销毁二叉树;{if(*root==NULL) return ;Destory(&((*root)->Lchild));Destory(&((*root)->Rchild));free(*root); *root=NULL;}void PreOrder(BiTree root)//先序遍历操作;{SeqStack *S=NULL;BiTree p; S=InitStack();p=root;while(p!=NULL||!IsEmpty(S)){while(p!=NULL){ Visit(p->data ); Push(S,p); p=p->Lchild;} if(!IsEmpty(S)) {Pop(S,&p);p=p->Rchild;}}}void InOrder(BiTree root)//中序遍历操作;{SeqStack *S=NULL;BiTree p;S=InitStack();p=root;while(p!=NULL||!IsEmpty(S)){while(p!=NULL){ Push(S,p); p=p->Lchild;}if(!IsEmpty(S)){Pop(S,&p);Visit(p->data );p=p->Rchild;}}}void PostOrder(BiTree root)//后序遍历操作;{ SeqStack *S=NULL;BiTree p,q;S=InitStack();p=root;q=NULL;while(p!=NULL||!IsEmpty(S)){while(p!=NULL){ Push(S,p); p=p->Lchild;} if(!IsEmpty(S)) { Top(S,&p); if((p->Rchild==NULL)||(p->Rchild==q)) { Pop(S,&p);Visit(p->data );q=p;p=NULL;} else p=p->Rchild; }}}void LevelOrder(BiTree root)//层次遍历;{SeQueue *Q=NULL;BiTree p;Q=InitQueue();EnterQueue(Q,root);while(EmptyQueue(Q)){DeleteQueue(Q,&p);Visit(p->data);if(p->Lchild!=NULL)EnterQueue(Q,p->Lchild);if(p->Rchild!=NULL) EnterQueue(Q,p->Rchild);}}void PreOrderCount(BiTree root)//先序遍历统计叶子结点数b;{if(root){if(root->Lchild==NULL&&root->Rchild==NULL) Count++;PreOrderCount(root->Lchild);PreOrderCount(root->Rchild);}}void InOrderPrint(BiTree root)//中序遍历输出叶子结点;{if(root){InOrderPrint(root->Lchild);if(root->Lchild==NULL&&root->Rchild==NULL)printf("\t%c",root->data);InOrderPrint(root->Rchild);}}void TreeDepth(BiTree root,int h)//求二叉树的高度;{if(root){if(h>depth) depth=h;TreeDepth(root->Lchild,h+1);TreeDepth(root->Rchild,h+1);}}BiTree Parent(BiTree root ,DataType current)//求二叉树的双亲结点;{BiTree p=NULL;if(root==NULL) return NULL;if(((root->Lchild!=NULL)&&(root->Lchild->data==current))||((root->Rchild!=NULL)&&(root->Rchild->data==current)))return root;p=Parent(root->Lchild,current);if(p!=NULL) return p;else return(Parent(root->Rchild,current));}BiTree LeftChild(BiTree root ,DataType current)//求二叉树的左孩子结点;{BiTree p;if(root==NULL) return NULL;if(root->data==current)return root->Lchild;p=LeftChild(root->Lchild,current);if(p!=NULL) return p;else return(LeftChild(root->Rchild,current));}BiTree RightChild(BiTree root ,DataType current)//求二叉树的右孩子结点;{BiTree p;if(root==NULL) return NULL;if(root->data==current)return root->Rchild;p=RightChild(root->Lchild,current);if(p!=NULL) return p;else return(RightChild(root->Rchild,current));}void PrintTree(BiTree root,int h)//按树状打印二叉树;{int i;if(root==NULL) return;else{PrintTree(root->Rchild,h+1);for(i=0;i<h;i++) printf(" ");printf("%c\n",root->data);PrintTree(root->Lchild,h+1);}}void text_BiTree(){int h=1;char cur[2]={0};BiTree current=NULL; BiTree root=NULL;Initiate(root);printf("\n请输入树的扩展的先序遍序列:");CreateBiTree(&root); TreeDepth(root, h);//求树的高度;printf("####1:树的高度为:%d\n",depth);printf("####2:二叉树的先序遍历序列:");PreOrder(root);//先序遍历操作;printf("\n");printf("####3:二叉树的中序遍历序列:");InOrder(root);//中序遍历操作;printf("\n");printf("####4:二叉树的后序遍历序列:");PostOrder(root);//后序遍历操作printf("\n");printf("####5:二叉树的层次遍历序列:");LevelOrder(root);//层次遍历操作printf("\n");printf("####6:求二叉树的双亲结点\n 输入所求的结点为:");scanf("%s",cur); if(current=Parent(root ,cur[0]))//求二叉树的双亲结点;printf(" 结点%c的双亲结点为:%c\n",cur[0],current->data);else printf(" 出错!");printf("####7:求二叉树的左孩子结点\n 输入所求的结点为:");scanf("%s",cur); if(current=LeftChild(root,cur[0]))//求左孩子结点;printf(" 结点%c的左孩子结点为:%c\n",cur[0],current->data);else printf(" 不存在左孩子!\n");printf("####8:求二叉树的右孩子结点\n 输入所求的结点为:");scanf("%s",cur); if(current=RightChild(root ,cur[0]))//求右孩子结点;printf(" 结点%c的右孩子结点为:%c\n",cur[0],current->data);else printf(" 不存在右孩子!\n");PreOrderCount(root);//先序遍历统计叶子结点的结点数;printf("####9:二叉树共有叶子结点%d个\n",Count);printf("####10:二叉树的叶子结点有:"); InOrderPrint(root);//中序遍历输出叶子结点;printf("\n");printf("####11:树状打印二叉树:\n");PrintTree(root,0);//按树状打印二叉树; Destory(&root);//销毁二叉树;if(root==NULL)printf("销毁二叉树成功!\n");else printf("销毁二叉树失败!\n");}main(){text_BiTree();}
0 0
- 程序员日记三号——二叉树
- 黑马程序员—日记说明
- 黑马程序员——交通灯学习日记
- 黑马程序员——学习日记
- 黑马程序员——150602学习日记
- 黑马程序员——学习日记1
- 黑马程序员——学习日记2
- 黑马程序员——学习日记3
- 黑马程序员——学习日记4
- 黑马程序员——学习日记5
- 黑马程序员——学习日记6
- 黑马程序员——学习日记7
- 黑马程序员——学习日记8
- 黑马程序员——学习日记9
- 黑马程序员——学习日记10
- 黑马程序员—学习日记1概述
- 黑马程序员—学习日记2概述
- 初学菜鸟的学习日记——二叉树(JAVA)
- SDP简介
- 重拾python 三十五
- 在ubuntu16.04LTS下编译linux内核
- QT之自定义菜单
- 《捉迷藏》每个人内心都有一种极端的渴望
- 程序员日记三号——二叉树
- 初中OJ1573. 【提高】下棋
- 今天真是傻,写代码,类声明忘了加分号。。。。然后。。。。。额。。。逗逼
- SSM框架搭建
- poj 1953 c语言 : World Cup Noise
- Python3 常用BIF( Built-in Functions)简介
- CentOS服务器时间同步
- 关于在Linux-ubuntu 16.04版本中以太网显示网络线缆被拔出的解决方法
- VM安装CentOS7 Minimal静态IP配置,并设置VM端口转发和xshell连接(三)