二叉树操作

    技术2022-05-11  39

    #include <stdio.h>#include <iostream>#include <queue>#include <stack>#include <malloc.h>#define SIZE 100

    using namespace std;

    typedef struct  BiTNode      //定义二叉树节点结构{ char  data;                     //数据域 struct BiTNode *lchild,*rchild; //左右孩子指针域}BiTNode,*BiTree;

    int visit(BiTree t);void CreateBiTree(BiTree &T);    //生成一个二叉树void PreOrder(BiTree);          //递归先序遍历二叉树void InOrder(BiTree);           //递归中序遍历二叉树void PostOrder(BiTree);         //递归后序遍历二叉树void InOrderTraverse(BiTree T); //非递归中序遍历二叉树void PreOrder_Nonrecursive(BiTree T);//非递归先序遍历二叉树void LeverTraverse(BiTree T);//非递归层序遍历二叉树

    //主函数void main(){ BiTree T;        char j; int flag=1; //---------------------程序解说----------------------- printf("本程序实现二叉树的操作。/n"); printf("叶子结点以空格表示。/n"); printf("可以进行建立二叉树,递归先序、中序、后序遍历,非递归先序、中序遍历及非递归层序遍历等操作。/n"); //---------------------------------------------------- printf("/n"); printf("请建立二叉树。/n"); printf("建树将以三个空格后回车结束。/n"); printf("例如:1 2 3 4 5 6   (回车)/n"); CreateBiTree(T);       //初始化队列 getchar(); while(flag)    {  printf("/n");  printf("请选择: /n");  printf("1.递归先序遍历/n");  printf("2.递归中序遍历/n");  printf("3.递归后序遍历/n");  printf("4.非递归中序遍历/n");  printf("5.非递归先序遍历/n");  printf("6.非递归层序遍历/n");  printf("0.退出程序/n");  scanf(" %c",&j);  switch(j)  {   case '1':if(T)            {    printf("递归先序遍历二叉树:");    PreOrder(T);    printf("/n");             }   else printf("二叉树为空!/n");   break;   case '2':if(T)            {    printf("递归中序遍历二叉树:");    InOrder(T);    printf("/n");            }   else printf("二叉树为空!/n");   break;   case '3':if(T)            {    printf("递归后序遍历二叉树:");    PostOrder(T);    printf("/n");            }   else printf("二叉树为空!/n");   break;   case '4':if(T)            {    printf("非递归中序遍历二叉树:");    InOrderTraverse(T);    printf("/n");            }   else printf("二叉树为空!/n");   break;   case '5':if(T)            {    printf("非递归先序遍历二叉树:");    PreOrder_Nonrecursive(T);    printf("/n");            }   else printf("二叉树为空!/n");   break;    case '6':if(T)            {    printf("非递归层序遍历二叉树:");    LeverTraverse(T);    printf("/n");            }   else printf("二叉树为空!/n");   break;    default:flag=0;printf("程序运行结束,按任意键退出!/n");  }    }

    }

    //建立二叉树void CreateBiTree(BiTree &T){ char ch; scanf("%c",&ch);    //读入一个字符    if(ch==' ') T=NULL; else  {  T=(BiTNode *)malloc(sizeof(BiTNode)); //生成一个新结点  T->data=ch;  CreateBiTree(T->lchild);  //生成左子树  CreateBiTree(T->rchild);  //生成右子树     }}

    //先序遍历的递归void PreOrder(BiTree T){ if(T) {  printf("%c ",T->data);  //访问结点  PreOrder(T->lchild);   //遍历左子树  PreOrder(T->rchild);   //遍历右子树 }}

    //中序遍历的递归void InOrder(BiTree T){ if(T) {  InOrder(T->lchild);   //遍历左子树   printf("%c ",T->data); //访问结点  InOrder(T->rchild);   //遍历右子树 }}

    //后序遍历的递归void PostOrder(BiTree T){ if(T) {  PostOrder(T->lchild); //遍历左子树  PostOrder(T->rchild); //访问结点  printf("%c ",T->data); //遍历右子树 }}

    //非递归中序遍历   void InOrderTraverse(BiTree T){ stack<BiTree> S; BiTree p; S.push(T);//跟指针进栈 while(!S.empty()) {  p=new BiTNode;  while((p=S.top())&&p)   S.push(p->lchild);//向左走到尽头  S.pop(); //空指针退栈  if(!S.empty())  {   p=S.top();   S.pop();   cout<<p->data<<"  ";   S.push(p->rchild);  } }

    }

    //先序遍历的非递归void PreOrder_Nonrecursive(BiTree T){ stack<BiTree> S; BiTree p;  S.push(T);//根指针进栈 while(!S.empty())//栈空时结束 {  while((p=S.top())&&p)  {   cout<<p->data<<"  ";   S.push(p->lchild);  }//向左走到尽头  S.pop();//弹出堆栈  if(!S.empty())  {   p=S.top();   S.pop();   S.push(p->rchild);//向右走一步  } }}

    void LeverTraverse(BiTree T){//非递归层次遍历 queue <BiTree> Q; BiTree p; p = T; if(visit(p)==1)  Q.push(p); while(!Q.empty()) {  p = Q.front();  Q.pop();  if(visit(p->lchild) == 1)    Q.push(p->lchild);  if(visit(p->rchild) == 1)   Q.push(p->rchild); }}

    int visit(BiTree T){ if(T) {  printf("%c ",T->data);  return 1; } else  return 0;} 


    最新回复(0)