二叉树遍历

来源:互联网 发布:伍聚网络股票 编辑:程序博客网 时间:2024/06/05 03:47
16 学年—17学年第 1 学期 数据结构实验任务书

专业名称:              实验学时:    2    

课程名称:数据结构      任课教师:  翟海霞     

实验题目: 二叉树的基本操作实现               

实验环境:    Visual C++ 6.0                   

实验目的:掌握二叉树的二叉链存储结构及表示。

          掌握二叉树的三种遍历算法(递归和非递归两类)。

          运用三种遍历的方法求解二叉树的有关问题。

实验内容:实现二叉树的二叉链表存储结构;

          实现先序、中序和后序遍历二叉树;

          遍历二叉树的应用:计算叶子结点、左右子树交换等。

 

要求:1、二叉树基本操作已实现,学习和进一步理解。

      2、在求总结点的程序中加入求叶子结点的功能。

      3、左右子树交换,按中序和后序是否也可以?

      4、选作:按层遍历二叉树。

#include<stdio.h>#include<stdlib.h>#define MAX 100 #include<queue>#define OK 1;char ch;//二叉树存储结构typedef struct BiTNode{char date;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree; //创建二叉链表表示的二叉树//Status CreateBiTree(BiTree &T)void CreateBiTree(BiTree &T){scanf("%c",&ch);if(ch=='#')T=NULL;//递归结束,建立空树else{T=(BiTree)malloc(sizeof(BiTNode));//生成根节点T->date=ch;//根节点数据域置为chCreateBiTree(T->lchild);CreateBiTree(T->rchild);}  }  //先序遍历 void PreTra(BiTree T) { if(T) { printf("%c",T->date); PreTra(T->lchild); PreTra(T->rchild); }  }   //中序遍历  void InTra(BiTree T)  {  if(T)  {  InTra(T->lchild);  printf("%c",T->date);  InTra(T->rchild);  }   }   //后序遍历   void  PostTra(BiTree T)   {   if(T)   {   PostTra(T->lchild);   PostTra(T->rchild);   printf("%c",T->date);   }   }   //层序遍历   void LevelTra(BiTree T)   {   BiTree Q[MAX];   int front=0,rear=0;   BiTree p;   //根节点入队   if(T)   {   Q[rear]=T;   rear=(rear+1)%MAX;//插入节点为新的队尾元素 }    while(front!=rear)   {   //队头元素出队    p=Q[front];   front=(front+1)%MAX; //删除头结点   printf("%c",p->date);   //左孩子不为空,入队   if(p->lchild)   {   Q[rear]=p->lchild;   rear=(rear+1)%MAX;//插入左孩子结点为新的队尾元素} if(p->rchild){Q[rear]=p->rchild;rear=(rear+1)%MAX;}} }   //计算节点数  int NodeCount(BiTree T)  {  if(T==NULL) return 0;  else  return NodeCount(T->lchild)+NodeCount(T->rchild)+1;   }   //交换左右子树 void Exchange(BiTree &T){if(T){BiTree s;s=T->lchild;T->lchild=T->rchild;T->rchild=s;Exchange(T->lchild);Exchange(T->rchild);} }  //主菜单函数 void menu() {  printf("1.建立二叉树\n"); printf("2.先序遍历二叉树\n"); printf("3.中序遍历二叉树\n"); printf("4.后序遍历二叉树\n"); printf("5.层序遍历\n"); printf("6.计算二叉树节点数\n"); printf("7.交换左右子树\n");} //主函数 ABC##DE#G##F#### int main(){printf("\n************************二叉树基本操作实现*******************\n\n");int n,num;BiTree T=NULL;menu();while(1){     printf("请输入你的选择:\n");scanf("%d",&n);switch(n){case 1:{   printf("输入各元素,空子树用#表示:\n");       CreateBiTree(T);       printf("创建成功!\n\n");   }break; case 2:{   printf("先序遍历:");       PreTra(T);printf("\n\n");   }break;    case 3:{       printf("中序遍历:");           InTra(T);   printf("\n\n");       }break;case 4:{      printf("后序遍历:");       PostTra(T);   printf("\n\n");       }break;case 5:{   printf("层序遍历:");       LevelTra(T);       printf("\n\n");       }break;case 6:{   num=NodeCount(T);       printf("结点数为:%d",num);       printf("\n\n");       }break;case 7:{   printf("交换左右子树:");       Exchange(T);       printf("交换成功!\n\n");       }break;case 0:exit(0); default: printf("无效输入!\n\n");   }}return 0;} 


0 0