c_数据结构_二叉树的遍历实现
发布时间:2020-12-16 09:16:50 所属栏目:百科 来源:网络整理
导读:#includestdio.h #include stdlib.h #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define True 1 // 定义二叉树的节点类型 typedef struct BiTNode{ char data; struct BiTNode *lchild; // 定义节点的左孩子指针,有孩子指针 struct BiTNode * rchil
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define True 1 // 定义二叉树的节点类型 typedef struct BiTNode{ char data; struct BiTNode *lchild; // 定义节点的左孩子指针,有孩子指针 struct BiTNode *rchild; }BiTNode,*BiTree; //先序遍历构造二叉链表表示对二叉树T int CreateBiTree(BiTree &T) { char ch; scanf("%c",&ch); fflush(stdin); // 对键盘缓冲区的处理 if(ch==‘#‘){ //如果输入#,创建空节点 T=NULL; }else{ if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))){ //申请根节点的空间 printf("申请节点空间失败!!"); exit(OVERFLOW); }else{ T->data=ch; //生成根节点 CreateBiTree(T->lchild); //构建左子树 CreateBiTree(T->rchild); //构建右子树 } return OK; } return ERROR; } //先序遍历二叉树 int DLR(BiTree T) { if(T!=NULL) // 如果树不为空 { printf("%cn",T->data); DLR(T->lchild); // 递归遍历 DLR(T->rchild); }else{ return ERROR; //树为空 } return OK; // 遍历成功 } //中序遍历二叉树 int LDR(BiTree T) { if(T!=NULL) { LDR(T->lchild); // 递归遍历 printf("%cn",T->data); LDR(T->rchild); }else{ return ERROR; //树为空 } return OK; // 遍历成功 } //后序遍历二叉树 int LRD(BiTree T) { if(T!=NULL) { LRD(T->lchild); // 递归遍历 LRD(T->rchild); printf("%cn",T->data); }else{ return ERROR; //树为空 } return OK; // 遍历成功 } // 树的叶子数 void yezi(BiTree T){ if(T!=NULL){ if(!T->lchild&&!T->rchild){ printf("%cn",T->data); // 打印叶子节点 } yezi(T->lchild); yezi(T->rchild); } } // 树的深度 int shendu(BiTree T){ int h=0,h1,h2; if(T==NULL) return h; else{ h1=shendu(T->lchild); h2=shendu(T->rchild); if(h1>=h2) // 最后加的数为树的最深 h=h1+1; else h=h2+1; } return h; } void OperateMenu() { printf("n--------------请选择元素处理方式---------nn"); printf("n注:请输入数字n"); printf("0>:退出操作n"); printf("1>:先序遍历二叉树n"); printf("2>:中序遍历二叉树n"); printf("3>:后序遍历二叉树n"); printf("4>:树的叶子节点n"); printf("5>:树的深度n"); printf("请选择对元素的处理:"); } void zushi(){ printf("注:此过程为二叉树的建立及其对其的相关操作nt以下为树的大致模型tn"); printf(" 1 n"); printf(" / n"); printf(" 2 3 n"); printf(" / / n"); printf(" # # # # n"); printf("n 注!!!楼上输入 # 表示无孩子为空n故输入序列为12##3###n"); printf("实际形成序列形成的树为为:n"); printf(" 1 n"); printf(" / n"); printf(" 2 3 n"); } int main(){ int w=0,k,n,boo=1; BiTree T; printf("请用户选择创建二叉树或退出程序:nn"); printf("创建二叉树请输入:‘1‘nn"); printf("退出请选择‘0‘或 其它!!nn"); printf("请选择:"); scanf("%d",&w); if(w==1){ zushi(); printf("n请输入树节点元素(请回车输入下一个数):n"); fflush(stdin); boo=CreateBiTree(T); if(!boo){ //printf("n构建成功!!n"); while(!boo){ printf("n构建树为空树,请重新构建:"); printf("n请输入树节点元素(请回车输入下一个数):n"); boo=CreateBiTree(T); } }else{ printf("n构建成功!!n"); } OperateMenu(); scanf("%d",&k); while(k){ switch(k){ case 0:break; case 1: printf("先序遍历结果为:n"); boo=DLR(T); if(boo) printf("n先序遍历成功!!n"); else printf("n先序遍历失败!!n"); break; case 2: printf("中序遍历结果为:n"); boo=LDR(T); if(boo) printf("n中序遍历成功!!n"); else printf("n中序遍历失败!!n"); break; case 3: printf("后序遍历结果为:n"); boo=LRD(T); if(boo) printf("n后序遍历成功!!n"); else printf("n后序遍历失败!!n"); break; case 4: printf("其中是叶子节点的是:n"); yezi(T); break; case 5:n=shendu(T); printf("树的深度为:%d",n); break; } OperateMenu(); scanf("%d",&k); } } return OK; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |