⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 binarytree.txt

📁 本程序实现二叉树的操作
💻 TXT
字号:
#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); //非递归中序遍历二叉树
//主函数
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("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;
   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);
  }
 }

}
int visit(BiTree T)
{
 if(T)
 {
  printf("%c ",T->data);
  return 1;
 }
 else
  return 0;
}
/*二叉链表的前序生成原则是  
1输入根结点值  
2若左子树不为空,则输入左子树,否则输入一个结束符, 
3若右子树不为空,则输入右子树,否则输入一个结束符*/  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -