#include<stdio.h> #include<malloc.h> #define MAXSIZE 20 typedef char TEelemtype; typedef struct BiTNode{ TEelemtype data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; //队列的方式 typedef struct queueelem { BiTNode* b[MAXSIZE]; int front,rear; }Queue; //栈的方式 //栈的结构体表示形式 typedef struct stackelem { BiTNode* a[MAXSIZE]; int top; }BtStack; BiTree CreateBiTree() { char ch; scanf("%c",&ch); getchar(); if(ch!='#'){ printf("输出当前节点的值:"); printf("%c\n",ch); BiTree tree=(BiTree)malloc(sizeof(BiTNode)); tree->data=ch; tree->lchild=CreateBiTree(); tree->rchild=CreateBiTree(); return tree; }else return NULL; } //前序遍历二叉树 void PreOrderTraverse(BiTree T) { if(T) { printf("%c",T->data); PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } } //前序遍历非递归形式 void PreOrder(BiTree T) { BtStack bt; bt.top=0; if(T==NULL) { printf("此二叉树为空!"); }else { bt.a[bt.top++]=T; while(bt.top>0) { printf("%c",bt.a[bt.top-1]->data); BiTNode *bnode=bt.a[bt.top-1]; // printf(" 输出数值:%d",bt.top); bt.top--; //printf("右孩子节点的值:%c",bnode->rchild->data); if(bnode->rchild!=NULL) { bt.a[bt.top]=bnode->rchild; bt.top++; // printf("右孩子节点的值:%c",bnode->rchild->data); } if(bnode->lchild!=NULL) { bt.a[bt.top]=bnode->lchild; // printf("左孩子节点的值:%c",bnode->lchild->data); bt.top++; } } } } //中序遍历 void InOrderTraverse(BiTree T) { if(T) { InOrderTraverse(T->lchild); printf("%c",T->data); InOrderTraverse(T->rchild); } } //中序遍历非递归的方式 void InOrder(BiTree T) { BtStack bt; bt.top=0; if(T==NULL) { printf("此二叉树为空!\n"); }else{ BiTNode *bnode=T; //将首节点也放进去 bt.a[bt.top]=T; bt.top++; //先遍历完最左边子树的节点 while(bnode->lchild!=NULL) { bt.a[bt.top]=bnode->lchild; bt.top++; bnode=bnode->lchild; } //依次输出子树的节点 while(bt.top>0) { //输出节点 printf("%c",bt.a[bt.top-1]->data); bnode=bt.a[bt.top-1]; bt.top--; while(bnode->rchild!=NULL) { bt.a[bt.top]=bnode->rchild; bt.top++; bnode=bnode->rchild; while(bnode->lchild!=NULL) { bt.a[bt.top]=bnode->lchild; bt.top++; } } } } } //后序遍历 void PostOrderTraverse(BiTree T) { if(T) { PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); printf("%c",T->data); } } //后序遍历非递归实现 void PostOrder(BiTree bt) { BtStack st; st.top=-1; BiTree t; int flag; do { while (bt!=NULL) { st.top++; st.a[st.top]=bt; bt=bt->lchild; } t=NULL; flag=1; while (st.top!=-1 && flag) { bt=st.a[st.top]; if (bt->rchild==t) //t:表示为null,或者右子节点被访问过了。 { printf("%c",bt->data); st.top--; t=bt; //t记录下刚刚访问的节点 } else { bt=bt->rchild; flag=0; } } } while (st.top!=-1); } //层序遍历 void LevelOrderTraverse(BiTree T) { Queue queue; queue.front=queue.rear=0; if(T==NULL) { printf("二叉树为空!\n"); }else{ queue.b[queue.rear] =T; queue.rear=queue.rear+1; while(queue.b[queue.front]!=NULL&&queue.rear!=queue.front) { printf("%c",queue.b[queue.front]->data); //如果左孩子节点不为空,加入到队列中 if(queue.b[queue.front]->lchild!=NULL) { queue.rear=(queue.rear+1)%MAXSIZE; queue.b[queue.rear]=queue.b[queue.front]->lchild; } if(queue.b[queue.front]->rchild!=NULL) { queue.rear=(queue.rear+1)%MAXSIZE; queue.b[queue.rear]=queue.b[queue.front]->rchild; } queue.front=(queue.front+1)%MAXSIZE;//当前节点的队列加1 } printf("%c",queue.b[queue.front]->data); } } //获取二叉树的高度 int Height(BiTree T) { int dept1,dept2; if(!T) { return 0; }else{ dept1=Height(T->lchild); dept2=Height(T->rchild); if(dept1>dept2) { return dept1+1; }else{ return dept2+1; } } } int main() { //创建二叉树 BiTree T=CreateBiTree(); //插入节点 //删除节点 //前序遍历 printf("前序遍历:\n"); PreOrderTraverse(T); printf("\n"); //中序遍历 printf("中序遍历:\n"); InOrderTraverse(T); printf("\n"); //后续遍历 printf("后序遍历:\n"); PostOrderTraverse(T); printf("\n"); //获取二叉树的高度 printf("二叉树的高度:\n"); int hight=Height(T); printf("%d\n",hight); //层序遍历 printf("输出层序遍历的结果:"); LevelOrderTraverse(T); printf("\n"); //前序遍历非递归方式 printf("按照前序非递归的方式进行遍历:"); PreOrder(T); printf("\n"); //中序遍历非递归方式 printf("按照中序非递归的方式进行遍历:"); InOrder(T); printf("\n"); //后序遍历非递归方式 printf("按照后序非递归的方式进行遍历:"); PostOrder(T); printf("\n"); system("pause"); return 0; }