文章标题
2016-08-07 10:46
344 查看
重点内容 二叉树的建立与遍历
强调内容 递归算法和指针引用
强调内容 递归算法和指针引用
//递归函数的调用 #include<stdio.h> #include<math.h> #include<stdlib.h> #define ERROR 1 typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; typedef int Status; Status CreateBiTree(BiTree &T) {//构造二叉树,按先序次序输入二叉树中结点的值,空格字符表示空树 char ch; scanf("%c", &ch); if (ch == ' ') T = NULL; else { if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW); T->data = ch; //生成根结点 CreateBiTree(T->lchild); //构造左子树 CreateBiTree(T->rchild); //构造右子树 } return 0; }//CreateBiTree Status PreOrderTraverse(BiTree T) {//先序遍历二叉树T,对于每个结点调用visit函数一次 if (T) { printf("%c",T->data); //visit函数最简单形式 if (PreOrderTraverse(T->lchild)) if (PreOrderTraverse(T->rchild)) return 0; return ERROR; } else return 0; }//PreOrderTraverse Status InOrderTraverse(BiTree T) {//中序遍历二叉树T,对于每个结点调用visit函数一次 if (T) { if (T->lchild) InOrderTraverse(T->lchild); printf("%c", T->data); if (T->rchild) InOrderTraverse(T->rchild); } return 0; }//InOrderTraverse Status PostOrderTraverse(BiTree T) {//后序遍历二叉树T,对于每个结点调用visit函数一次 if (T) { if (T->lchild) PostOrderTraverse(T->lchild); if (T->rchild) PostOrderTraverse(T->rchild); printf("%c", T->data); } return 0; }//PostOrderTraverse Status DeepBiTree(BiTree T) {//求二叉树高度 int l = 0, r = 0; if (T == NULL) return 0; else if (T->lchild == NULL && T->rchild == NULL) return 1; else{ l = DeepBiTree(T->lchild) + 1; r = DeepBiTree(T->rchild) + 1; return (l>r ? l : r); } }//HighBiTree Status LeafBiTree(BiTree T) {//求二叉树的叶子结点 if (T == NULL) return 0; else if (T->lchild == NULL && T->rchild == NULL) return 1; else return (LeafBiTree(T->lchild) + LeafBiTree(T->rchild)); }//LeafBiTree Status Parent(BiTree T, char son){ //查找指定结点的双亲,从根节点开始 if (T == NULL) return 0; if (((T->lchild) && (T->lchild->data == son)) ||((T->rchild) && (T->rchild->data == son))){ printf("该结点的双亲为:%c\n",T->data); return 0; } else{ Parent(T->lchild, son); Parent(T->rchild, son); return 0; } } Status Borther(BiTree T, char borther){ //查找指定节点的兄弟,从根节点开始 if (T == NULL) return 0; if ((T->lchild) && (T->lchild->data == borther)){ if (T->rchild){ printf("该节点的兄弟为:%c\n",T->rchild->data); } else{ printf("该节点没有兄弟节点"); } return 0; } else if((T->rchild) && (T->rchild->data == borther)){ if (T->lchild){ printf("该节点的兄弟为:%c",T->lchild->data); } else{ printf("该节点没有兄弟节点"); } return 0; } else{ Borther(T->lchild, borther); Borther(T->rchild, borther); return 0; } } void main(){ int n; BiTNode *T; do{ printf("\n"); printf("**********二叉树的基本操作及应用*****************\n"); printf("*1 创建 *\n"); printf("*2 遍历 *\n"); printf("*3 计算树的深度及叶子结点的个数 *\n"); printf("*4 查找双亲 *\n"); printf("*5 查找兄弟 *\n"); printf("*6 退出 *\n"); printf("*************************************\n"); printf("请选择:"); scanf("%d", &n); switch(n){ case 1: getchar(); printf("请先序输入二叉树的结点,空格表示空树\n"); CreateBiTree(T); printf("创建成功"); break; case 2: printf("先序遍历:"); PreOrderTraverse(T); printf("\n"); printf("中序遍历:"); InOrderTraverse(T); printf("\n"); printf("后序遍历:"); PostOrderTraverse(T); printf("\n"); break; case 3: printf("树的深度为:%d\n",DeepBiTree(T)); printf("叶子结点的个数为:%d",LeafBiTree(T)); getchar(); getchar(); break; case 4: char son; printf("请输入需要查询的节点:"); getchar(); scanf("%c",&son); Parent(T, son); break; case 5: char borther; printf("请输入需要查询的节点:"); getchar(); scanf("%c",&borther); Borther(T, borther); break; case 6: break; default: printf("ERROR!"); break; } }while(n!=6); }