赞
踩
查找自己家族的族谱,至少上溯至祖爷爷辈;
族谱二叉树的建立(树的深度要>=4);
三种不同遍历算法遍历此二叉树;
统计二叉树的深度,输出叶子结点的信息。
问题分析
本次作业是构建一个二叉树,储存本家族的族谱信息,实际就是二叉树的简单应用,包括构建二叉树,二叉树的遍历,求解二叉树的深度,打印叶子节点。整个程序不算复杂,但是调试起来有很多细节需要注意。话不多说,直接贴代码
#include<stdio.h> #include<stdlib.h> typedef struct BiTNode //节点结构 { char data;//数据域 struct BiTNode *lchild, *rchild;//左孩子 右孩子 }BiTNode, *BiTree; void PreOrderTraverse(BiTree T)//二叉树的先序遍历 { if (T == NULL) return; printf("%c ", T->data); PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } void InOrderTraverse(BiTree T)//二叉树的中序遍历 { if (T == NULL) return; InOrderTraverse(T->lchild); printf("%c ", T->data); InOrderTraverse(T->rchild); } void PostOrderTraverse(BiTree T)//后序遍历 { if (T == NULL) return; PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); printf("%c ", T->data); } int countDepth(BiTNode *T)//输出二叉树深度 { if (T == NULL) return 0; else if (T->lchild == NULL && T->rchild == NULL) return 1; else { int depth1 = countDepth(T->lchild) + 1; int depth2 = countDepth(T->rchild) + 1; return depth1 > depth2 ? depth1 : depth2; } } void Value(BiTree T)//打印叶子节点 { if (T != NULL) { if (T->lchild == NULL && T->rchild == NULL) printf("%c", T->data); Value(T->lchild); Value(T->rchild); } } void CreateBiTree(BiTree *T)//构建二叉树 { char ch; scanf_s("%c", &ch); if (ch == '#') *T = NULL; else { *T = (BiTree)malloc(sizeof(BiTNode)); if (!*T) exit(-1); (*T)->data = ch; CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } } int main() { BiTree T; printf("先序输入族谱(以##结束):"); CreateBiTree(&T); getchar(); printf("先序输出族谱为:"); PreOrderTraverse(T); getchar(); printf("中序输出族谱为:"); InOrderTraverse(T); getchar(); printf("后序输出族谱为:"); PostOrderTraverse(T); getchar(); printf("叶子节点为:"); Value(T); getchar(); printf("这棵树的深度:%d\n", countDepth(T)); getchar(); return 0; }
输出结果
我选择的二叉树是
先序遍历ABDGCEHIFJK
中序遍历DGBAHEICJFK
后序遍历GDBHIEJKFCA
叶子节点GHIJK
深度4
整个程序到这里就结束了,有几个容易出错的地方:
首先要对每一种遍历方式足够了解,才能在输入的时候输入正确的二叉树,然后程序输出时多次使用到getchar()
函数,是防止程序运行时一闪而过,看不到输出
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。