#include<stdio.h> #include<stdlib.h> typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; int count,x; int CreateBiTree(BiTree *T) {//链式创建二叉树 char ch; getchar();//吞回车 scanf("%c",&ch); if(ch =='#') { *T = NULL; //递归结束,建空树 } else { if(!(*T= (BiTree)malloc(sizeof(BiTNode))) ) exit(0); (*T)->data=ch; CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } return 1; } int PreOrderTraverse(BiTree T) {//前序遍历 if(T == NULL) return 1; else { printf("%c",T->data); PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } return 1; } int InOrderTraverse(BiTree T) {//中序遍历 if(T == NULL) return 1; else{ InOrderTraverse(T->lchild); printf("%c",T->data); InOrderTraverse(T->rchild); } } int PostOrderTraverse(BiTree T) {//后序遍历 if(T == NULL) return 1; else { PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); printf("%c",T->data); } } int CountLeaf(BiTree root) //采用先序遍历的递归算法 {//统计二叉树中叶子结点的个数 if(root != NULL) //非二叉树的条件,还可以写成if(root) { if(!root->lchild && !root->rchild) //是叶子结点则统计并打印 { count++; printf("%c\n",root->data); } CountLeaf(root->lchild); //递归遍历左子树,直到叶子处 CountLeaf(root->rchild); //递归遍历右子树,直到叶子处 } return 1; } int Depth(BiTree T) { if(T == NULL) return 0; else{ int m = Depth(T->lchild); int n = Depth(T->rchild); if(m >= n) return m+1; else return n+1; } } int main() { BiTree T; int i; printf("1----链式创建二叉树\n"); printf("2----先序遍历\n"); printf("3----中序遍历\n"); printf("4----后序遍历\n"); printf("5----计算二叉树的深度\n"); printf("6----统计二叉树中叶子结点的个数\n"); printf("若退出,请输入一个负数!\n\n"); while ( i>=0 ) { printf("请输入操作代码:"); scanf("%d", &i); if(i == 1) { CreateBiTree(&T); printf("链式创建二叉树成功\n"); } else if(i == 2) { if(PreOrderTraverse(T) ) printf("先序遍历成功\n"); } else if(i == 3) { if( InOrderTraverse(T) ) printf("中序遍历成功\n"); } else if(i == 4) { if( PostOrderTraverse(T) ) printf("后序遍历成功\n"); } else if(i == 5) { if( CountLeaf(T) ) { printf("统计成功!二叉树中叶子结点的个数:%d\n",count); } } else if(i == 6) { if( Depth(T) ) { x= Depth(T); printf("深度为:%d\n",x); } } else if(i < 0) { printf("退出成功!\n"); break; } } return 0; } /* 注意点: 1. BiTNode :指的是结构体,相当于结点 BiTree :属于指针类型,可以将结点连接起来,所以在定义头结点时,使用指针指向头结点; 2. C语言中,想要指针实现实参和形参值的一致,Bitree*,(*T)->data,(*T):是指向头结点的指针; 3. getchar():吞并换行符(类似于回车之类的) */
二叉树-C语言
最新推荐文章于 2023-07-21 22:07:27 发布