二叉树实验5
来源:互联网 发布:豆瓣fm for windows 编辑:程序博客网 时间:2024/05/22 02:12
// 1.构建二叉树。<先序>// 2. 先中后 序遍历二叉树 <中,非递归>// 3.独生子女的个数。// 4.二叉树的深度。#include<cstdio>#include<cstdlib>#define OK 1#define OVERFLOW -2#define ERROR 0#define MAX 20typedef struct BiTNode{ char data; struct BiTNode *lchild, *rchild;}BiTNode, *BiTree;int GreateBiTree(BiTree &T) // 1 先序构建二叉树{ char ch; scanf("%c",&ch); if(ch=='#') T=NULL; else { if(!(T = (BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW); T->data = ch; GreateBiTree(T->lchild); GreateBiTree(T->rchild); } return OK;} // GreateBiTreevoid PreOrder(BiTree T) // 2.1 /*先序遍历的非递归算法*/{ BiTree stack[MAX],q; int top=0,i; for(i=0;i<MAX;i++) stack[i]=NULL;/*初始化*/ q=T; while(q!=NULL) { printf("%c",q->data); if(q->rchild!=NULL) stack[top++]=q->rchild; if(q->lchild!=NULL) q=q->lchild; else if(top>0) q=stack[--top]; else q=NULL; }}/*中序遍历二叉树非递归 */typedef struct Snode{ char data; BiTree p; /******修改******/ struct Snode *next;}Snode,*LinkStack;int InitStack(LinkStack &S) // 创建堆栈 2.2.1{ S=NULL; return OK;}int StackEmpty(LinkStack S) // 判断栈是不是空 2.2.2{ if(!S) return 1; return 0;}int Push(LinkStack &S,BiTree P) // 入栈 2.2.3{ Snode *e=new Snode; if(!e) { return OVERFLOW; } e->p=P; /******修改******/ // printf("%c->",P->data); e->next=S; S=e; return OK;}int Pop(LinkStack &S,BiTree &P) // 出栈 2.2.4{ Snode *Q; if(!S) return ERROR; P=S->p; Q=S; S=S->next; delete Q; return OK;}void InOrderTraverse(BiTree T) // 2.2{ BiTree P; LinkStack S; InitStack(S); // 2.2.1 P=T; while(P||!StackEmpty(S)) // 2.2.2 { if(P) { // printf("123\n"); Push(S,P); P=P->lchild; // 2.2.3 } else { //printf("1\n"); Pop(S,P); // 2.2.4 printf("%c",P->data); P=P->rchild; } // else }// while} // InOrderTraverse/* 中序遍历二叉树非递归 */void PostOrder(BiTree p) // 2.3 后序遍历二叉树{ if ( p!= NULL ) { PostOrder( p->lchild ) ; PostOrder( p->rchild) ; printf("%c", p->data); }}int onechild(BiTree T) // 3 独生子女的个数{ int num1,num2; if(T==NULL) return 0; else if((T->lchild==NULL && T->rchild!=NULL)||(T->lchild!=NULL && T->rchild==NULL)) return 1; else { num1=onechild(T->lchild); num2=onechild(T->rchild); return num1+num2; }}int Depth(BiTree T ) // 4返回二叉树的深度{ int depthLeft,depthRight; int depthval=0; if (!T) int depthval=0; else{ depthLeft = Depth( T->lchild ); depthRight= Depth( T->rchild ); depthval= 1 + (depthLeft > depthRight ? depthLeft : depthRight); } return depthval;} // Depthint main(){ BiTree T; int m,n,k=1,dep,one; printf("--------------构建一个二叉树-------------\n\n"); printf("输入二叉树的先序序列,用#代表虚结点,如ABD###CE##F#\n"); GreateBiTree(T); printf("------------------------------\n"); printf("1.遍历二叉树:\n"); printf("2.求二叉树独生子女的个数:\n"); printf("3.求二叉树的深度:\n"); printf("4.退出:\n"); printf("------------------------------\n"); while(k) { printf("请选择 1-4步骤:\n"); scanf("%d",&m); switch(m) { case 1: { printf("------------------------------\n"); printf("先序遍历二叉树:\n"); PreOrder(T); printf("\n"); printf("中序遍历二叉树:\n"); InOrderTraverse(T); printf("\n"); printf("后序遍历二叉树:\n"); PostOrder(T); printf("\n"); break; } case 2: { one=onechild(T); printf("二叉树独生子女的个数是: %d\n\n",one); break; } case 3: { dep=Depth(T); printf("二叉树的深度是: %d\n\n",dep); break; } case 4: return 0; default:return 0; } printf("------------------------------\n"); printf("1.遍历二叉树:\n"); printf("2.求二叉树独生子女的个数:\n"); printf("3.求二叉树的深度:\n"); printf("4.退出:\n"); printf("------------------------------\n"); } while(1); return 0;}
0 0
- 二叉树实验5
- 实验5:树和二叉树的实验1
- 实验5:树和二叉树的实验1
- 实验5:树和二叉树的实验1
- 实验5:树和二叉树的实验1
- 实验5:树和二叉树的实验1
- 实验5:二叉树的顺序存储实验
- 实验5:树和二叉树
- 二叉树实验
- 二叉树实验代码
- 二叉树实验
- 二叉树实验报告
- 二叉树实验
- 实验五 二叉树
- 二叉树实验
- 二叉树实现实验
- 实验报告 二叉树
- 实验7-二叉树
- CSDN博客,想说爱你不容易,我只能选择离开!
- CSS兼容性问题
- 【BZOJ】【P2318】【Spoj4060 game with probability Problem】【题解】【概率DP】
- 这是最好的企业管理手册
- 字符编码笔记:ASCII,Unicode和UTF-8
- 二叉树实验5
- C语言及程序设计初步例程-25 用switch语句实现多分支结构
- Map按key降序排列
- Red Hat 6.5 配置第三方yum源
- java反射机制
- 红黑树插入删除节点过程分析 && C代码实现
- C++ 在多线程中使用mciSendString播放音乐 上篇
- Map按照Value值进行排序
- uva 11464(贪心)