文章标题
来源:互联网 发布:linux认证工程师 编辑:程序博客网 时间:2024/06/05 11:28
重点内容 二叉树的建立与遍历
强调内容 递归算法和指针引用
//递归函数的调用#include<stdio.h>#include<math.h>#include<stdlib.h>#define ERROR 1typedef 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;}//CreateBiTreeStatus 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;}//PreOrderTraverseStatus 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;}//InOrderTraverseStatus 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;}//PostOrderTraverseStatus 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); }}//HighBiTreeStatus 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));}//LeafBiTreeStatus 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);}
0 0
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- TestNG中的组groups概念
- 简易加密工具类
- 关于扩展欧几里得算法的一些资料
- nand flash驱动的编写
- 微软面试百题002——返回优先级的栈
- 文章标题
- Java Exception 捕获和展示
- hdu 2841 Visible Trees 容斥,分解质因数
- SharedPreferences存储
- Three.js学习笔记---我和小伙伴都惊呆了
- PHP位运算符详解
- 向量基础知识
- HDU 5800 To My Girlfriend (动态规划)
- Ajax 异步加载