#include#include #define MaxSize 100 #define OK 1 #define ERROR 0 typedef char ElemType; typedef struct BTinNode { ElemType data; struct BTinNode *lchild; struct BTinNode *rchild; }BTinNode,*BinTree; typedef BinTree QlemType; typedef struct { QlemType num[MaxSize]; int front; int rear; } Queue; Queue Q; void initilize() { Q.front = 0; Q.rear = 0; } int Push(BTinNode *T) { if((Q.rear+1)==Q.front) return 0; else Q.num[++Q.rear] = T; return 1; } int Empty() { if(Q.front==Q.rear) return 1; else return 0; } BTinNode *Pop() { if(Q.front==Q.rear) return 0; return Q.num[++Q.front]; } void Creat(BinTree *T) { ElemType ch; scanf("%c",&ch); if(ch == '#') *T = NULL; else { *T = (BinTree)malloc(sizeof(BTinNode)); if(!*T) printf("失败n"); (*T)->data = ch; Creat(&(*T)->lchild); Creat(&(*T)->rchild); } } void PrtOrder(BinTree T) { if(T == NULL) return; if(T->lchild==NULL&&T->rchild==NULL) { printf("%c ",T->data); return; } printf("%c ",T->data); PrtOrder(T->lchild); PrtOrder(T->rchild); } void InOrder(BinTree T) { if(T == NULL) return; if(T->lchild==NULL&&T->rchild==NULL) { printf("%c ",T->data); return; } InOrder(T->lchild); printf("%c ",T->data); InOrder(T->rchild); } void PostOrder(BinTree T) { if(T == NULL) return; if(T->lchild==NULL&&T->rchild==NULL) { printf("%c ",T->data); return; } PostOrder(T->lchild); PostOrder(T->rchild); printf("%c ",T->data); } int Deep(BinTree T) { int m,n; if(T == NULL) return 0; else if(T->lchild==NULL&&T->rchild==NULL) { return 1; } else { m = Deep(T->lchild); n = Deep(T->rchild); if(m>n) return (m+1); else return (n+1); } } BTinNode *preorder_x(BTinNode *bt, char x) { BTinNode *t=NULL; if (bt != NULL){ if (bt->data==x) return bt; t=preorder_x(bt->lchild, x); if(t) return t; t=preorder_x(bt->rchild, x); if(t) return t; } return NULL; } int depth(BTinNode *bt) { int hl=0,hr=0; if (bt == NULL) return 0; else if (bt->lchild == NULL && bt->rchild == NULL) return 1; else{ hl = depth(bt->lchild); hr = depth(bt->rchild); return (hl>hr?hl:hr)+1; } } int NodeCount(BinTree T) { if(T == NULL) return 0; else return NodeCount(T->lchild) + NodeCount(T->rchild) +1; } int LeafCount(BinTree T) { if(!T) return 0; if(!T->lchild &&!T->rchild) { return 1; } else { return LeafCount(T->lchild)+LeafCount(T->rchild); } } int exchange(BinTree T) { BTinNode *temp; if(!T) return 0; if(T->lchild == NULL && T->rchild == NULL) return 0; else { temp = T->lchild; T->lchild = T->rchild; T->rchild = temp; } if(T->lchild) exchange(T->lchild); if(T->rchild) exchange(T->rchild); return 1; } void LevelOrder(BinTree T) { BTinNode *temp; if(!T) return; if(T->lchild==NULL&&T->rchild==NULL) { printf("%c ",T->data); return; } Push(T); while (!Empty()) { temp = Pop(); printf("%c ", temp->data); if(temp->lchild) Push(temp->lchild); if(temp->rchild) Push(temp->rchild); } } int main() { BTinNode *p; int m,n,y; char x; BinTree T = NULL; printf("先序遍历生成二叉树n"); Creat(&T); printf("--------------------二叉树的建立与应用-------------------------n"); printf(" 1.二叉树的先序遍历n"); printf(" 2.二叉树的中序遍历n"); printf(" 3.二叉树的后序遍历n"); printf(" 4.二叉树的深度n"); printf(" 5.二叉树的结点的个数n"); printf(" 6.二叉树叶子结点的个数n"); printf(" 7.二叉树层次遍历n"); printf(" 8.每个结点的左右子树交换位置n"); printf(" 9.求二叉树以某个结点X为根的子树的深度n"); printf(" 10.退出系统n"); printf("----------------------------------------------------------------n"); while(1) { scanf("%d",&m); if(m==1) {printf("先序遍历为:"); PrtOrder(T); printf("n");} if(m==2) {printf("中序遍历为:"); InOrder(T); printf("n");} if(m==3) {printf("后序遍历为:"); PostOrder(T); printf("n");} if(m==4) {n = Deep(T); printf("树的深度:%dn",n);} if(m==5) {n = NodeCount(T); printf("树的结点数:%dn",n);} if(m==6) {n = LeafCount(T); printf("叶子结点数:%dn",n);} if(m==7) {printf("层次遍历为:"); initilize(); LevelOrder(T); printf("n");} if(m==8) { printf("左右子树进行交换:n"); if(exchange(T)==1) printf("交换完成!n"); printf("交换后中序遍历为:n"); InOrder(T); printf("n"); printf("交换后先序遍历为:n"); PrtOrder(T); printf("n"); printf("交换后后序遍历为:n"); PostOrder(T); printf("n"); printf("交换后层次遍历为:n"); initilize(); LevelOrder(T); printf("n");} if(m==9) { printf("请输入某个X结点:"); getchar(); x=getchar(); p=preorder_x(T,x); y=depth(p); printf("深度结果如下:%dn",y); } if(m==10) exit(1); } }



