二叉树的各种操作
来源:互联网 发布:python 每天执行一次 编辑:程序博客网 时间:2024/06/03 07:20
数据结构实验,主要是对二叉树的各种操作方法。
#include <stdio.h>#include <stdlib.h>#include <string.h>#define TRUE 1#define FALSE 0#define maxsize 100typedef struct TreeNode{ char data; struct TreeNode *left; struct TreeNode *right; int visit;//在遍历的时候用于标记此结点的左右结点是否都已经访问过}TreeNode,BinaryTree;//void CreateBiTree(BinaryTree **T,char *definition);//创建树void CreateBiTree(BinaryTree **T);//创建树int EditTreeNode(BinaryTree *T,int position,char NEW);//修改树的结点void DeleteTree(BinaryTree *T);//删除树void PrintTree(BinaryTree *T,int layer);//按照树的形状打印树int BiTreeDepth(BinaryTree *T);//求树的高度int BiTreeDepth_recursive(BinaryTree *T);//递归求树的高度int LeafNumber(BinaryTree *T);//求叶子的数目int LeafNumber_recursive(BinaryTree *T);//递归求叶子的数目void PreOrderTraverse(TreeNode *T,void (*visit)());//前序遍历void PreOrderTraverse_recursive(TreeNode *T,void (*visit)());//递归求前序遍历void InOrderTraverse(TreeNode *T,void (*visit)());//中序遍历void InOrderTraverse_recursive(TreeNode *T,void (*visit)());//递归求中序遍历void PostOrderTraverse(TreeNode *T,void (*visit)());//后序遍历void PostOrderTraverse_recursive(TreeNode *T,void (*visit)());//递归求后序遍历void LevelOrderTraverse(TreeNode *T,void (*visit)());//层次遍历void display(int e);void menu(void);TreeNode *Traverse(TreeNode *Node);char definition[maxsize];int i=0;int main(){ BinaryTree *T=NULL; int op=0; do { system("cls"); menu(); op=0; printf(" Please input your option[0-12]:"); scanf("%d",&op); switch(op) { case 0: break; case 1: { if(T) { printf("该二叉树已经存在,是否确认覆盖重新创建?1:是;2:否:"); int ok=0; scanf("%d",&ok); if(ok==0) { system("pause"); break; } else//free掉二叉树各个节点 { BinaryTree *stack[maxsize],*p; int top=-1; stack[++top]=T; while(top>-1) { p=stack[top--]; if(p->right)stack[++top]=p->right; if(p->left)stack[++top]=p->left; free(p); } T=NULL; } } printf("请在一行内输入各个结点代号大写字母值,空结点用空格代替,请勿输入其他字符,树将以前序遍历方式建立\n"); //char definition[maxsize]; memset(definition,maxsize,'\0'); i=0; getchar(); gets(definition);//printf("\n%s\n",definition); //scanf("%s",definition); //CreateBiTree(&T,definition); CreateBiTree(&T); printf("恭喜创建成功!\n"); system("pause"); break; } case 2: { if(!T) { printf("该二叉树不存在!\n"); system("pause"); break; } int position=0; char NEW; printf("请按照树从左至右、从上到下的编号顺序,输入你要修改值的结点编号:"); scanf("%d",&position); getchar(); printf("\n请此处的新值[单个字母]:"); scanf("%c",&NEW); int ok=EditTreeNode(T,position,NEW); if(ok==FALSE)printf("你输入的位置信息有误!\n"); else printf("修改成功!\n"); system("pause"); break; } case 3: { if(!T) { printf("该二叉树不存在!\n"); system("pause"); break; } printf("该树的深度是:%d\n",BiTreeDepth(T)); system("pause"); break; } case 4: { if(!T) { printf("该二叉树不存在!\n"); system("pause"); break; } printf("该二叉树叶子数为:%d\n",LeafNumber(T)); system("pause"); break; } case 5: { if(!T) { printf("该二叉树不存在!\n"); system("pause"); break; } PreOrderTraverse(T,display); printf("\n"); system("pause"); break; } case 6: { if(!T) { printf("该二叉树不存在!\n"); system("pause"); break; } InOrderTraverse(T,display); printf("\n"); system("pause"); break; } case 7: { if(!T) { printf("该二叉树不存在!\n"); system("pause"); break; } PostOrderTraverse(T,display); printf("\n"); system("pause"); break; } case 8: { if(!T) { printf("该二叉树不存在!\n"); system("pause"); break; } LevelOrderTraverse(T,display); printf("\n"); system("pause"); break; } case 9: { if(!T) { printf("该二叉树不存在!\n"); system("pause"); break; } DeleteTree(T); T=NULL; printf("删除成功!\n"); system("pause"); break; } case 10: { if(!T) { printf("该二叉树不存在!\n"); system("pause"); break; } printf("提示:此处的二叉树是横向输出,树的每一行对应着这里的相应列:\n"); PrintTree(T,0); system("pause"); break; } case 11: { if(!T) { printf("该二叉树不存在!\n"); system("pause"); break; } printf("该树的深度是:%d\n",BiTreeDepth_recursive(T)); system("pause"); break; } case 12: { if(!T) { printf("该二叉树不存在!\n"); system("pause"); break; } printf("该二叉树叶子数为:%d\n",LeafNumber_recursive(T)); system("pause"); break; } case 13: { if(!T) { printf("该二叉树不存在!\n"); system("pause"); break; } PreOrderTraverse_recursive(T,display); printf("\n"); system("pause"); break; } case 14: { if(!T) { printf("该二叉树不存在!\n"); system("pause"); break; } InOrderTraverse_recursive(T,display); printf("\n"); system("pause"); break; } case 15: { if(!T) { printf("该二叉树不存在!\n"); system("pause"); break; } PostOrderTraverse_recursive(T,display); printf("\n"); system("pause"); break; } default : printf("wrong input.\n"); system("pause"); break; } }while(op); return 0;}void CreateBiTree(BinaryTree **T){ if(definition[i]==' ')*T=NULL; else { *T=(BinaryTree *)malloc(sizeof(BinaryTree)); (*T)->visit=0; (*T)->data=definition[i++]; CreateBiTree(&((*T)->left)); i++; CreateBiTree(&((*T)->right)); }}int EditTreeNode(BinaryTree *T,int position,char NEW)//修改树的结点{ BinaryTree *quene[maxsize],**p; int front=0,back=0; quene[back++]=T; int count=0; while(front<back) { p=&quene[front++]; ++count; if(count==position)break; if((*p)->left)quene[back++]=(*p)->left; if((*p)->right)quene[back++]=(*p)->right; } if(count<position)return FALSE; (*p)->data=NEW; return TRUE;}void DeleteTree(BinaryTree *T)//删除树{ if(T) { BinaryTree *p=NULL; p=T; DeleteTree(T->left); DeleteTree(T->right); free(p); p=NULL; }}void PrintTree(BinaryTree *T,int layer)//按照树的形状打印树{ int i; if(T==NULL) return; PrintTree(T->right,layer+1); for(i=0;i<layer;i++) printf(" "); printf("%c\n",T->data); PrintTree(T->left,layer+1);}int BiTreeDepth(BinaryTree *T)//求树的高度{ BinaryTree *stack[maxsize],*p=T; int tag[maxsize]; int top=-1; int count=0; while(p || top>-1) { while(p) { stack[++top]=p; tag[top]=0; p=p->left; } if(tag[top]==1) { count=count>(top+1)?count:(top+1); --top; p=NULL; } else { p=stack[top]; tag[top]=1; p=p->right; } } return count;}int BiTreeDepth_recursive(BinaryTree *T)//递归求树的高度{ if(T==NULL)return 0; else { int h_left=0,h_right=0; if(T->left==NULL && T->right==NULL)return 1; h_left=BiTreeDepth_recursive(T->left); h_right=BiTreeDepth_recursive(T->right); return h_left>h_right?(h_left+1):(h_right+1); }}int LeafNumber(BinaryTree *T)//求叶子的数目{ BinaryTree *stack[maxsize],*p; int top=-1; int count=0; if(T) { stack[++top]=T; while(top>-1) { p=stack[top--]; if(p->right)stack[++top]=p->right; if(p->left)stack[++top]=p->left; if(p->left==NULL && p->right==NULL)++count; } return count; }}int LeafNumber_recursive(BinaryTree *T)//递归求叶子的数目{ if(T==NULL)return 0; else { int left=0,right=0; if(T->left==NULL && T->right==NULL)return 1; if(T->left) left=LeafNumber_recursive(T->left); if(T->right) right=LeafNumber_recursive(T->right); return left+right; }}void PreOrderTraverse(BinaryTree *T,void (*visit)())//前序遍历{ BinaryTree *stack[maxsize],*p; int top=-1; if(T) { stack[++top]=T; while(top>-1) { p=stack[top--]; visit(p->data); if(p->right)stack[++top]=p->right; if(p->left)stack[++top]=p->left; } }}void PreOrderTraverse_recursive(BinaryTree *T,void (*visit)())//递归求前序遍历{ if(T) { visit(T->data); PreOrderTraverse_recursive(T->left,display); PreOrderTraverse_recursive(T->right,display); }}void InOrderTraverse(BinaryTree *T,void (*visit)())//中序遍历{ BinaryTree *stack[maxsize],*p; int top=-1; while(top>-1 || T!=NULL) { while(T) { stack[++top]=T; T=T->left; } if(top>-1) { p=stack[top--]; visit(p->data); T=p->right; } }}void InOrderTraverse_recursive(BinaryTree *T,void (*visit)())//递归求中序遍历{ if(T) { InOrderTraverse_recursive(T->left,display); visit(T->data); InOrderTraverse_recursive(T->right,display); }}void PostOrderTraverse(BinaryTree *T,void (*visit)())//后序遍历{ BinaryTree *stack[maxsize],*p=NULL; int top=-1; if(T)stack[++top]=T; while(top>-1) { p=stack[top--]; if(p->visit)visit(p->data); else { p->visit=1; stack[++top]=p; if(p->right) { p->right->visit=0; stack[++top]=p->right; } if(p->left) { p->left->visit=0; stack[++top]=p->left; } } }}void PostOrderTraverse_recursive(BinaryTree *T,void (*visit)())//递归求后序遍历{ if(T) { PostOrderTraverse_recursive(T->left,display); PostOrderTraverse_recursive(T->right,display); visit(T->data); }}void LevelOrderTraverse(BinaryTree *T,void (*visit)())//层次遍历{ BinaryTree *quene[maxsize],*p; int front=0,back=0; quene[back++]=T; while(front<back) { p=quene[front++]; visit(p->data); if(p->left)quene[back++]=p->left; if(p->right)quene[back++]=p->right; }}void menu(void){ printf("\n\n"); printf(" Menu for Binary Tree On Sequence Structure \n"); printf("------------------------------------------------------------------\n"); printf(" 1. 创建二叉树 9. 删除二叉树\n"); printf(" 2. 修改二叉树 10. 显示二叉树\n"); printf(" 3. 非递归求树深度 11. 递归求树深度\n"); printf(" 4. 非递归求树叶子数 12. 递归求树叶子数 \n"); printf(" 5. 非递归前序遍历 13. 递归前序遍历\n"); printf(" 6. 非递归中序遍历 14. 递归中序遍历\n"); printf(" 7. 非递归后序遍历 15. 递归后序遍历\n"); printf(" 8. 层次遍历二叉树 0.退出(Exit)\n"); printf("------------------------------------------------------------------\n");}void display(int e){ printf("%c ",e);}
0 0
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树各种操作
- 二叉树各种操作
- 【树】二叉树的各种操作
- 二叉查找树的各种操作
- 二叉查找树的各种操作
- 二叉查找树的各种操作源码
- 二叉树的各种操作_源代码
- 遍历二叉树的各种操作
- 遍历二叉树的各种操作
- 二叉树各种操作的总结
- 二叉树的各种遍历操作
- vim 用法总结
- freemarker报错之五
- 浅谈探索性测试
- ubuntu下的mv命令
- JavaWeb过滤器(filter)的认识
- 二叉树的各种操作
- EJB中各角色的分析
- Faulty Odometer--2012天津网络赛--数位dp
- Win7与虚拟机VMware下运行的Ubuntu共享文件夹
- osgi 学习——普通jar包osgi化
- 对象的克隆
- 8086汇编双人贪食蛇游戏
- DM365 DVSDK采集264视频VLC实时播放
- 从京东IPO看电商的下一个十年