二叉树的相关操作

来源:互联网 发布:特朗普访华意义知乎 编辑:程序博客网 时间: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