首页 > 代码库 > 11、二叉树
11、二叉树
二叉树
二叉树操作1
#include<stdio.h> //‘ ‘空格代表树的元素为空 #include<stdlib.h> #define OVERFLOW -1 typedef char TElemType; typedef struct BitNode { TElemType data; struct BitNode *lchild,*rchild; }BitNode,*BitTree; typedef struct QNode { BitNode data; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; void BinTreeInit(BitNode **BT) //初始化二叉树 { *BT=NULL; } BitNode *BinTreeCreat(BitNode *BT) //按先序次序构造二叉树 { char c; scanf("%c",&c); if(c==‘ ‘)BT=NULL; else { if(!(BT=(BitTree)malloc(sizeof(BitNode)))) exit(OVERFLOW); BT->data=http://www.mamicode.com/c;"%c",BT->data); } void PreOrderTraverse(BitNode *BT)//先序遍历树 { if(BT) { visit(BT); PreOrderTraverse(BT->lchild); PreOrderTraverse(BT->rchild); } } void InOrderTraverse(BitNode *BT)//中序遍历树 { if(BT) { InOrderTraverse(BT->lchild); visit(BT); InOrderTraverse(BT->rchild); } } void PostOrderTraverse(BitNode *BT)//后序遍历树 { if(BT) { PostOrderTraverse(BT->lchild); PostOrderTraverse(BT->rchild); visit(BT); } } void InitQueue(LinkQueue *Q) //构造一个空的队列 { Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q->front)exit(OVERFLOW); Q->front->next=NULL; } int QueueEmpty(LinkQueue *Q) { if(Q->rear==Q->front)return 1; else return 0; } void EnQueue(LinkQueue *Q,BitNode e) //入队 { QNode *p; p=(QueuePtr)malloc(sizeof(QNode)); if(!p)exit(OVERFLOW); p->data=http://www.mamicode.com/e;"执行创建树操作后: "); if(BinTreeEmpty(BT))printf("树空\n");//判空 else printf("树不空\n"); printf("先序遍历二叉树: "); PreOrderTraverse(BT);printf("\n"); printf("中序遍历二叉树: "); InOrderTraverse(BT);printf("\n"); printf("后序遍历二叉树: "); PostOrderTraverse(BT);printf("\n"); printf("层次遍历二叉树: "); BFSTraverse(BT);printf("\n"); printf("二叉树的深度为:%d\n",BinTreeDepth(BT));//求二叉树的深度 BinCountleaf(BT,&count);//求二叉树中的节点个数 printf("二叉树的叶子节点个数为:%d\n",count); BinTreeClear(&BT);//清空树 printf("执行清空树操作后: "); if(BinTreeEmpty(BT)==1)printf("树空\n");//判空 else printf("树不空\n"); return 0; } 或者将构造二叉树的操作改为,main函数里对此函数的调用扫做修改即可: void BinTreeCreat(BitNode **BT) //按先序次序构造二叉树 { char c; scanf("%c",&c); if(c==‘ ‘)*BT=NULL;//此处曾把‘*‘漏掉 else { if(!((*BT)=(BitTree)malloc(sizeof(BitNode)))) exit(OVERFLOW); (*BT)->data=http://www.mamicode.com/c;"%c",(*BT)->data); BinTreeCreat(&(*BT)->lchild); BinTreeCreat(&(*BT)->rchild); } }
二叉树操作2
#include "string.h" #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 100 /* 存储空间初始分配量 */ typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */ /**********定义二叉树的存储结构************/ typedef char TElemType; TElemType Nil=‘ ‘; /* 字符型以空格符为空 */ typedef struct BinTreeNode /* 结点结构 */ { TElemType data; /* 结点数据 */ struct BinTreeNode *lchild,*rchild; /* 左右孩子指针 */ }BinTreeNode,*BinTree; /*****************************************/ /***********用于构造二叉树************** */ int index=1; //自定义了一个字符数组类型 typedef char charArray[24]; /*声明一个char类型数组,charArray是数组名也是一个指针*/ charArray str; //str字符数组类型的数组名,charArray等价于char * Status AssignStr(charArray T,char *chars) //char *chars是字符类型的指针变量 { int i; if(strlen(chars)>MAXSIZE) return ERROR; /*输入字符的长度超过存储空间最大值*/ else { T[0]=strlen(chars); /*0号单元存放字符串长度*/ for(i=1;i<=T[0];i++) { T[i]=*(chars+i-1); //先将数据进行存储 } return OK; } } /* ************************************* */ /*构造二叉树*/ void CreateBinTree(BinTree *T) { TElemType ch; ch=str[index++]; if(ch==‘#‘) *T=NULL; else { *T=(BinTree)malloc(sizeof(BinTreeNode)); if(!*T) exit(OVERFLOW); (*T)->data=http://www.mamicode.com/ch; /* 生成根结点 */ "%c ",T->data); /* 显示结点数据,可以更改为其它对结点操作 */ PreOrderTraverse(T->lchild); /* 再先序遍历左子树 */ PreOrderTraverse(T->rchild); /* 最后先序遍历右子树 */ } /*中序遍历 思路:中序遍历左子树--->访问根节点--->中序遍历右子树 */ void InOrderTraverse(BinTree T) { if(T==NULL) return; InOrderTraverse(T->lchild); /* 中序遍历左子树 */ printf("%c ",T->data); /* 显示结点数据,可以更改为其它对结点操作 */ InOrderTraverse(T->rchild); /* 最后中序遍历右子树 */ } /*后序遍历 思路:后序遍历左子树--->后序遍历右子树--->访问根节点 */ void PostOrderTraverse(BinTree T) { if(T==NULL) return; PostOrderTraverse(T->lchild); /* 先后序遍历左子树 */ PostOrderTraverse(T->rchild); /* 再后序遍历右子树 */ printf("%c ",T->data); /* 显示结点数据,可以更改为其它对结点操作 */ } int main() { int i; BinTree T; TElemType e1; /*初始化二叉树为一棵空树*/ InitBinTree(&T); /*设置字符数组用于构造二叉树*/ AssignStr(str,"ABDH#K###E##CFI###G#J##"); /*创建二叉树*/ CreateBinTree(&T); printf("创建二叉树后,树空否?%d(1:是 0:否) 树的深度为:%d\n",IsBinTreeEmpty(T),GetDepth(T)); /*获取二叉树的根节点*/ e1=GetRoot(T); printf("\n二叉树的根为: %c\n",e1); /*前序遍历*/ printf("\n前序遍历二叉树:"); PreOrderTraverse(T); /*中序遍历*/ printf("\n中序遍历二叉树:"); InOrderTraverse(T); /*后序遍历*/ printf("\n后序遍历二叉树:"); PostOrderTraverse(T); /*清空二叉树*/ ClearBinTree(&T); printf("\n\n清除二叉树后,树空否?%d(1:是 0:否) 树的深度为:%d\n",IsBinTreeEmpty(T),GetDepth(T)); i=GetRoot(T); if(!i) printf("树空,无根\n"); getchar(); }
11、二叉树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。