二叉树的相关操作
来源:互联网 发布:特朗普访华意义知乎 编辑:程序博客网 时间:2024/04/26 03:24
二叉树的相关操作
BintreeNode.h#ifndef BINTREENODE_H#define BINTREENODE_Htypedef char Datatype;typedef struct BinTreeNode{Datatype data;struct BinTreeNode *lchild;struct BinTreeNode *rchild;}BinTreeNode;BinTreeNode *CreateNode(Datatype elem);#endifBinTree.h#ifndef BINTREE_H#define BINTREE_H#include "BinTreeNode.h"typedef struct BinTree{BinTreeNode *root;int count;}BinTree;void Init(BinTree *r);void BinTreeCreate(BinTree *r);int BinTreeDepth(BinTreeNode *r);int BinTreeWidth(BinTreeNode *r);int BinTreeNodes(BinTree *r);int BinTreeLeaves(BinTreeNode *r);void BinTreeDestroy(BinTreeNode *r);BinTreeNode *FindNode(BinTreeNode *r,Datatype elem);void DisplayBinTree(BinTreeNode *r);void PreOrder(BinTreeNode *r);void PostOrder(BinTreeNode *r);void InOrder(BinTreeNode *r);void AllPath(BinTreeNode *r,char path[],int pathlen);#endifBinTreeNode.c#include<stdio.h>#include<stdlib.h>#include "BinTreeNode.h"BinTreeNode *CreateNode(Datatype elem){BinTreeNode *p=(BinTreeNode *)malloc(sizeof(BinTreeNode));if(!p){printf("No enough memory!");exit(-1);}p->data=elem;p->lchild =p->rchild =NULL;return p;}BinTree.c#include<stdio.h>#include<stdlib.h>#include"BinTree.h"int Leavescount=0;void Init(BinTree *r){r->count=0;r->root=NULL;}void BinTreeCreate(BinTree *r){char str[100];int i=0,top=-1;char flag;BinTreeNode *p=NULL;BinTreeNode *Stack[50];printf("Please input a string: ");scanf("%s",str);getchar();while(str[i]!='\0'){switch(str[i]){ case '(':top++;Stack[top]=p;flag='l';break; case ',':flag='r';break; case ')':top--;break; default: p=CreateNode(str[i]); if(r->root==NULL) { r->root =p; r->count =1; } else { if(flag=='l') { Stack[top]->lchild =p; r->count++; } else { Stack[top]->rchild =p; r->count++; } } break;}//end of switchi++;}//end of while}int BinTreeDepth(BinTreeNode *r){int ldepth=0,rdepth=0;if(!r)return 0;else{ldepth=BinTreeDepth(r->lchild);rdepth=BinTreeDepth(r->rchild);return (ldepth>rdepth?(ldepth+1):(rdepth+1));}}void DisplayBinTree(BinTreeNode *p){if(p){printf("%c",p->data);if(p->lchild ||p->rchild){printf("(");DisplayBinTree(p->lchild );printf(","); DisplayBinTree(p->rchild );printf(")");}}}int BinTreeNodes(BinTree *r){return r->count;}int BinTreeLeaves(BinTreeNode *r){if(r){BinTreeLeaves(r->lchild);BinTreeLeaves(r->rchild); if(!r->lchild&&!r->rchild)Leavescount++;}return Leavescount;}void BinTreeDestroy(BinTreeNode *r){BinTreeNode *p=r;if(!p)return;BinTreeDestroy(p->lchild);BinTreeDestroy(p->rchild);free(p);p=NULL;}BinTreeNode *FindNode(BinTreeNode *r,Datatype elem){BinTreeNode *p=NULL;if(r==NULL)return NULL;else if(r->data==elem)return r;else{p=FindNode(r->lchild,elem);if(p)return p;elsereturn FindNode(r->rchild,elem);}}int BinTreeWidth(BinTreeNode *r){struct Queue{int lnode;BinTreeNode *p;}Queue[50];int front,rear;int lnum,max,i,n;front=rear=0;if(r!=NULL){rear++;Queue[rear].p=r;Queue[rear].lnode=1;while(rear!=front){front++;r=Queue[front].p;lnum=Queue[front].lnode;if(r->lchild!=NULL){rear++;Queue[rear].p=r->lchild;Queue[rear].lnode=lnum+1;}if(r->rchild!=NULL){rear++;Queue[rear].p=r->lchild;Queue[rear].lnode=lnum+1;}}max=0;lnum=1;i=1;while(i<=rear){n=0;while(i<=rear&&Queue[i].lnode==lnum){n++;i++;}lnum=Queue[i].lnode;if(max<n)max=n;}return max;}elsereturn 0;}void PreOrder(BinTreeNode *r){BinTreeNode *Stack[50];int top=-1;BinTreeNode *p;if(r!=NULL){top++;Stack[top]=r;while(top>-1){p=Stack[top];top--;printf("%c",p->data);if(p->rchild!=NULL){top++;Stack[top]=p->rchild;}if(p->lchild!=NULL){top++;Stack[top]=p->lchild;}}printf("\n");}}void InOrder(BinTreeNode *r){BinTreeNode *Stack[50];int top=-1;BinTreeNode *p=NULL;if(r!=NULL){p=r;while(top>-1||p!=NULL){while(p!=NULL){top++;Stack[top]=p;p=p->lchild;}if(top>-1){p=Stack[top];top--;printf("%c",p->data);p=p->rchild;}}printf("\n");}}void PostOrder(BinTreeNode *r){BinTreeNode *p=NULL;struct Stack{BinTreeNode *pt;int tag;}Stack[50];int top=-1;top++;Stack[top].pt=r;Stack[top].tag=1;while(top>-1){if(Stack[top].tag==1){p=Stack[top].pt;top--;if(p!=NULL){top++;Stack[top].pt=p;Stack[top].tag=0;top++;Stack[top].pt=p->rchild;Stack[top].tag=1;top++;Stack[top].pt=p->lchild;Stack[top].tag=1;}}if(Stack[top].tag==0){printf("%c",Stack[top].pt->data);top--;}}}void AllPath(BinTreeNode *r,char path[],int pathlen){int i;if(r!=NULL){if(r->lchild==NULL&&r->rchild==NULL){printf("The path is %c to root: %c ",r->data,r->data );for(i=pathlen-1;i>=0;i--)printf("%c ",path[i]);printf("\n");}else{path[pathlen]=r->data;pathlen++;AllPath(r->lchild,path,pathlen);AllPath(r->rchild,path,pathlen);pathlen--;}}}/* a b dc e*/main.c#include<stdio.h>#include<stdlib.h>#include"BinTreeNode.h"#include"BinTree.h"void menu(void){printf("\n");printf("-----------------------------------------------------\n");printf(" Menu Version 1.0\n");printf("-----------------------------------------------------\n");printf("1.Tree nodes 2.Display the tree \n");printf("3.Create the tree 4.Tree Depth \n");printf("5.Tree width 6.Tree leaves \n");printf("7.Find node 8.PreOrder \n");printf("9.InOrder 10.PostOrder \n");printf("11.AllPath 12.Destroy and exit \n");printf("Please input your choice: ");}int main(void){BinTree t;int choice;char elem;char path[50];Init(&t);while(1){menu();scanf("%d",&choice);getchar();switch(choice){case 1:printf("The nodes of the tree is: %d !\n",BinTreeNodes(&t));break;case 2:DisplayBinTree(t.root);printf("\n");break;case 3:BinTreeCreate(&t);break;case 4:printf("The depth of the tree is: %d !\n",BinTreeDepth(t.root));break;case 5:printf("The width of the tree is: %d !\n",BinTreeWidth(t.root));break;case 6:printf("The leaves of the tree is: %d !\n",BinTreeLeaves(t.root));break;case 7:printf("Please input the node you want to check: ");scanf("%c",&elem);getchar();if(FindNode(t.root,elem))printf("Find success!\n");elseprintf("Not find!\n");break;case 8:PreOrder(t.root);break;case 9:InOrder(t.root);break;case 10:PostOrder(t.root);break;case 11:AllPath(t.root,path,0);break;case 12:BinTreeDestroy(t.root);exit(0);break;default:printf("Illegal input!\n");break;}}return 0;}
1 0
- 二叉树的相关操作
- 二叉树的相关操作
- 二叉树的相关操作
- 二叉树的相关操作
- 二叉树的相关操作
- 二叉树的相关操作
- 二叉树的相关操作
- 二叉树的相关操作
- 二叉树的相关操作
- 二叉树的相关操作
- 二叉树的相关操作
- 二叉树的相关操作
- 二叉树相关操作
- 二叉树相关操作
- 二叉树相关操作
- 二叉树相关操作
- 二叉树 相关操作
- 二叉树相关操作
- 友元函数和友元类
- 不用闭包,不用函数,实现传递"参数"的功能
- Linux查看机器名及修改方法
- c#webservice 分析器错误信息: 未能创建类型“Service1”
- 很高兴 认识大家
- 二叉树的相关操作
- nslookup命令详解
- 2013年终总结
- 复制对象(一)copy和mutableCopy方法
- 在游戏中如何使用LUA脚本语言
- thinkphp 非法数据对象
- Eclipse PHP 中 启动apache 出错
- 程序员求职面试心经40条——谨记原则
- 图的相关操作