C语言演示二叉树算法

二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2i − 1个结点;深度为k的二叉树至多有2k − 1个结点;对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0 = n2 + 1。二叉树算法常被用于实现二叉查找树和二叉堆。

操作方法

  • 01

    首先打开VC++6.0

  • 02

    选择文件,新建

  • 03

    选择C++ source file 新建一个空白文档

  • 04

    首先声明头文件

  • 05

    定义树的结点结构 typedef struct TreeNode{ char data;/*树中结点的数据是一个字符*/ struct TreeNode *lchild; struct TreeNode *rchild; }TREENODE;

  • 06

    声明变量 int NodeNum = 0;/*统计数的结点数*/ int LeafNum = 0;/*统计数的叶子结点数*/ char ch[] = {'a', 'b', 'c', ' ', ' ', 'd', ' ', ' ', 'e',  'f', ' ', ' ', 'g', ' ', ' '}; int inc = 0;

  • 07

    用函数建立一个二叉树 int CreateBiTree(TREENODE **T) /*按先序次序输入二叉树中结点的值,以空字符表示空树*/ { char i; if(ch[inc++]==' ') *T = NULL; else { printf("%c\n",ch[inc-1]); if(!(*T = (TREENODE *)malloc(sizeof(TREENODE)))) return -1; (*T)->data = ch[inc-1]; printf("%c\n",(*T)->data); CreateBiTree(&((*T)->lchild)); CreateBiTree(&((*T)->rchild)); } return 1; }

  • 08

    先序遍历二叉树 int PreOderTraverse(TREENODE *T) { if(T) { printf("%c  ",T->data); PreOderTraverse(T->lchild); PreOderTraverse(T->rchild); } return 1; }

  • 09

    中序遍历二叉树 int InOderTraverse(TREENODE *T) { if(T) { InOderTraverse(T->lchild); printf("%c  ",T->data); InOderTraverse(T->rchild); } return 1; }

  • 10

    后序遍历二叉树 int BackOderTraverse(TREENODE *T) { if(T) { BackOderTraverse(T->lchild); BackOderTraverse(T->rchild); printf("%c  ",T->data); } return 1; }

  • 11

    利用先序遍历来计算树中的结点数 void CountNodeNum(TREENODE *T) { if(T) { NodeNum ++; CountNodeNum(T->lchild); CountNodeNum(T->rchild); } }

  • 12

    利用先序遍历计算叶子节点数 void CountLeafNum(TREENODE *T) { if(T) { if((!(T->lchild))&&(!(T->rchild))) LeafNum ++; CountLeafNum(T->lchild); CountLeafNum(T->rchild); } }

  • 13

    主函数 int main() { TREENODE *T; int i; CreateBiTree(&T); do { puts("**************************************************"); puts("*                   you can choose:              *"); puts("*  1:  Traverse the Binary tree by pre order     *"); puts("*  2:  Traverse the Binary tree by mid order     *"); puts("*  3:  Traverse the Binary tree by back order    *"); puts("*  4:  Count the node num of the Binary tree     *"); puts("*  5:  Count the leaf node num of the Binary tree*"); puts("**************************************************"); puts("please input your choice:"); scanf("%d",&i); switch(i) { case 1: printf("The preoder is:\n"); PreOderTraverse(T); printf("\n"); break; case 2: printf("The midoder is:\n"); InOderTraverse(T); printf("\n"); break; case 3: printf("The backoder is:\n"); BackOderTraverse(T); printf("\n"); break; case 4: CountNodeNum(T); printf("The nodenum of the tree is:%d\n",NodeNum); break; case 5: CountLeafNum(T); printf("The leafnum of the tree is:%d\n",LeafNum); break; } printf("please input any char to go on\n"); getch(); }while((i>=1)&&(i<6)); getch(); return 1; }

  • 14

    运行结果

(0)

相关推荐

  • C语言编程基础知识总结

    操作方法 01 在编程语言学习中,学习和巩固基础知识是很重要的,因为用来用去还是遵守最基本的语法规则,小小的错误需要花费双倍的时间去检查,所以选择一开始就写好才是最明智的,C语言数据结构与算法基础知识 ...

  • C语言该怎么学

    C语言是一门应用广泛的计算机语言.用它我们可以编写程序.可以制作应用.那么我们该怎么学习呢? 操作方法 01 .这门课不好学,但是只要功夫到就能学好.所以当你拿着教材感到很困难时,不要灰心. 02 坚 ...

  • 谷歌、百度、有道翻译哪个更好用?谷歌翻译/百度翻译/有道翻译实用性对比

    谷歌翻译/百度翻译/有道翻译哪个好?谷歌翻译ios版最近在国内解禁,相比之前只能在网页端使用谷歌翻译,使用app会更加方便了,随着谷歌的加入自然会有网友有选择纠结症了,谷歌.百度.有道这几大翻译软件到 ...

  • nex和findx哪个好

    vivo和OPPO分别发布了自己的旗舰手机NEX和FindX.两款手机都非常优秀,拥有众多"黑科技",也让我们犯了选择困难症.这次就让我们详细对比一下nex和findx究竟哪个更好 ...

  • 易语言数学函数在程序与算法中的应用

    编程本就是同数学密不可分的一项技术,各类的高端程序算法之中更是凝结无数人类智慧的结晶. 列如:快速排列.欧几里德算法.加密.BFPRT等.而数学函数则是这之中的一个基本的构成. 操作方法 01 下面是 ...

  • 如何使用算法编写C语言程序

    C语言中,一个程序主要包括两方面的信息:数据结构和算法.数据结构是对数据的描述,在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式.算法是对操作的描述,即要求计算机进行操作的步骤. 程序=数 ...

  • C语言插入排序算法及代码

    插入排序是排序算法的一种,它不改变原有的序列(数组),而是创建一个新的序列,在新序列上进行操作.这里以从小到大排序为例进行讲解. 操作方法 01 基本思想及举例说明 插入排序的基本思想是,将元素逐个添 ...

  • 归并排序算法C语言实现

    对于数据较大的输入,归并排序是比较快的一个算法.该算法采用的是分治法的思想. 归并排序的原理 01 归并排序的原理:先将数据分开排序,然后再合并起来,最后形成一个排好的序列. 归并排序 01 并归排序 ...

  • 如何使用c语言编写二分查找算法

    折半查找又称为二分查找法,这种查找方法有两个条件限制: 1:必须采用顺序存储结构,对于链表不适合: 2:必须按照关键字大小有序排列: 具体的算法思想: 对于数组进行比较的时候,比较数组大小的中间值,当 ...