首页 求树和二叉树的深度题目及源程序代码

求树和二叉树的深度题目及源程序代码

举报
开通vip

求树和二叉树的深度题目及源程序代码求树和二叉树的深度题目及源程序代码 树和二叉树 以下问题要求统一在一个大程序里解决。 10、按先序遍历的扩展序列建立二叉树的存储结构 11、二叉树先序、中序、后序遍历的递归算法 12、二叉树中序遍历的非递归算法 13、二叉树层次遍历的非递归算法 14、求二叉树的深度(后序遍历) 15、建立树的存储结构 16、求树的深度 17、 源程序代码: // tree.cpp : Defines the entry point for the console application. // #inclu...

求树和二叉树的深度题目及源程序代码
求树和二叉树的深度题目及源程序代码 树和二叉树 以下问题要求统一在一个大程序里解决。 10、按先序遍历的扩展序列建立二叉树的存储结构 11、二叉树先序、中序、后序遍历的递归算法 12、二叉树中序遍历的非递归算法 13、二叉树层次遍历的非递归算法 14、求二叉树的深度(后序遍历) 15、建立树的存储结构 16、求树的深度 17、 源程序代码: // tree.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "stdio.h" #include "stdlib.h" #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -1 typedef char TElemType; // 元素数据类型 typedef int Status; /* 二叉链表储存结构 */ typedef struct BiTNode { TElemType data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; bool CreateBiTree(BiTree &T) { //先序序列建立二叉树 char ch; scanf("%c",&ch); if (ch=='*') T = NULL; else { if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR; T->data = ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } return OK; } Status PrintElement(TElemType e) { // 访问函数 printf("%c", e); return OK; } Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType)) { //先序遍历二叉树的递归算法 if (T) { if (Visit(T->data)) if (PreOrderTraverse(T->lchild, Visit)) if (PreOrderTraverse(T->rchild, Visit)) return OK; return ERROR; }else return OK; } Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType)) { //中序遍历二叉树的递归算法 if (T) { if (InOrderTraverse(T->lchild, Visit)) if (Visit(T->data)) if (InOrderTraverse(T->rchild, Visit)) return OK; return ERROR; }else return OK; } Status PostOrderTraverse(BiTree T, Status(*Visit)(TElemType)) { //后序遍历二叉树的递归算法 if (T) { if (PostOrderTraverse(T->lchild, Visit)) if (PostOrderTraverse(T->rchild, Visit)) if (Visit(T->data)) return OK; return ERROR; }else return OK; } /* 栈存储结构及操作 */ typedef struct { BiTree *base; BiTree *top; int stacksize; }Stack; Status InitStack(Stack &S) { //构造空栈 S.base = (BiTree*)malloc(STACK_INIT_SIZE * sizeof(BiTree)); if (!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; } Status GetTop(Stack S, BiTree &e){ //读栈顶元素 if (S.top == S.base) return ERROR; e = *(S.top - 1); return OK; } Status Push(Stack &S, BiTree e){ //入栈 if (S.top - S.base >= S.stacksize) { S.base = (BiTree*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(BiTree)); if (!S.base) exit(OVERFLOW); S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++ = e; return OK; } Status Pop(Stack &S, BiTree &e){ //出栈 if (S.top == S.base) return ERROR; e = *--S.top; return OK; } Status StackEmpty(Stack S){ //判栈空 if (S.base == S.top) return TRUE; else return FALSE; } Status InOrderTraverse2(BiTree T, Status (*Visit)(TElemType)) { //中序遍历二叉树的非递归算法 Stack S; BiTree p; InitStack(S); Push(S, T); while (!StackEmpty(S)) { while (GetTop(S, p) && p) Push(S, p->lchild); Pop(S, p); if (!StackEmpty(S)) { Pop(S, p); if (!Visit(p->data)) return ERROR; Push(S, p->rchild); } } return OK; } #define MAXLEN 100 void LevelOrderTraverse(BiTree T, Status (*Visit)(TElemType)) { //层次遍历二叉树 struct node { BiTree vec[MAXLEN]; int f,r; }q; q.f=0; q.r=0; if (T != NULL) Visit(T->data); q.vec[q.r]=T; q.r=q.r+1; while (q.flchild != NULL) { Visit(T->lchild->data); q.vec[q.r]=T->lchild; q.r=q.r+1; } if (T->rchild != NULL) { Visit(T->rchild->data); q.vec[q.r]=T->rchild; q.r=q.r+1; } } } int BiTreeDepth(BiTree T) { //求二叉树的深度 int depthval, depthLeft, depthRight; if (!T) depthval = 0; else { depthLeft = BiTreeDepth( T->lchild ); depthRight= BiTreeDepth( T->rchild ); depthval = 1 + (depthLeft > depthRight ? depthLeft : depthRight); } return depthval; } /* 树的二叉链表储存结构 */ typedef struct CSNode{ TElemType data; struct CSNode *firstchild, *nextsibling; } CSNode, *CSTree; /* 队列存储结构及操作 */ typedef struct QNode { CSTree data; struct QNode *next; }QNode, *QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; Status InitQueue(LinkQueue &Q) { //构造空队列 Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode)); if (!Q.front) exit(OVERFLOW); Q.front->next = NULL; return OK; } Status DestoryQueue(LinkQueue &Q) { //销毁队列 while (Q.front) { Q.rear = Q.front->next; free(Q.front); Q.front = Q.rear; } return OK; } Status EnQueue(LinkQueue &Q, CSTree e) { //入队 QueuePtr p; p = (QueuePtr)malloc(sizeof(QNode)); if (!p) exit(OVERFLOW); p->data = e; p->next = NULL; Q.rear->next = p; Q.rear = p; return OK; } Status DeQueue(LinkQueue &Q, CSTree &e) { //出队 QueuePtr p; if (Q.front == Q.rear) return ERROR; p = Q.front->next; e = p->data; Q.front->next = p->next; if (Q.rear == p) Q.rear = Q.front; free(p); return OK; } Status GetHead(LinkQueue &Q, CSTree &e) { //读队头 QueuePtr p; if (Q.front == Q.rear) return ERROR; p = Q.front->next; e = p->data; return OK; } CSTree GetTreeNode(TElemType e) { //建立树的孩子 //-兄弟链表结点 CSTree p; p = (CSTree)malloc(sizeof(CSNode)); if (!p) exit(OVERFLOW); p->data = e; p->firstchild = NULL; p->nextsibling = NULL; return p; } Status CreatTree(CSTree &T) { //建立树的孩子 //-兄弟链表 char first = ' ', second = ' '; int result = 0; LinkQueue Q; CSTree p, s, r; InitQueue(Q); T = NULL; for(scanf("%c%c", &first, &second); second != '#'; result = scanf("%c%c", &first, &second)) { p = GetTreeNode(second); EnQueue(Q, p); if (first == '#') T = p; else { GetHead(Q,s); while (s->data != first) { DeQueue(Q,s); GetHead(Q,s); } if (!(s->firstchild)) { s->firstchild = p; r = p; }else { r->nextsibling = p; r =p; } } } return OK; } int TreeDepth(CSTree T) { //求树的深度 int h1, h2; if (!T) return 0; else { h1 = TreeDepth(T->firstchild); h2 = TreeDepth(T->nextsibling); return(((h1+1)>h2)?(h1+1):h2); } } int main(int argc, char* argv[]) { BiTree testT; printf("请输入二叉树先序序列(如 AB*C***):"); CreateBiTree(testT); printf("\n"); printf("二叉树的深度是: "); printf("%d", BiTreeDepth(testT)); printf("\n"); printf("先序递归遍历顺序:"); PreOrderTraverse(testT, PrintElement); printf("\n"); printf("中序递归遍历顺序:"); InOrderTraverse(testT, PrintElement); printf("\n"); printf("后序递归遍历顺序:"); PostOrderTraverse(testT, PrintElement); printf("\n"); printf("层次非递归遍历顺序: "); LevelOrderTraverse(testT, PrintElement); printf("\n"); printf("中序非递归遍历顺序: "); InOrderTraverse2(testT, PrintElement); printf("\n\n"); while (getchar() != '\n'); //清除缓冲区字符 CSTree testT2; printf("自上而下自左至右输入树的各条边(如 #AABACADCECFEG##):"); CreatTree(testT2); printf("\n"); printf("树的深度是: "); printf("%d", TreeDepth(testT2)); printf("\n"); return 0; }
本文档为【求树和二叉树的深度题目及源程序代码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_751406
暂无简介~
格式:doc
大小:31KB
软件:Word
页数:12
分类:生活休闲
上传时间:2017-10-07
浏览量:85