二叉树(2)

来源:互联网 发布:唐山学院网络教育 编辑:程序博客网 时间:2024/04/29 00:06
#include<iostream>
#include<cstdio>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#define error -1
//#define scanf scanf_s
typedef int ElementType;//假定节点数据为整数
#define NoInfo 0//用0表示没有节点
typedef struct TNode *Position;//定义二叉树类型结构
typedef Position BinTree;
struct TNode{
 ElementType Data;
 BinTree Left;
 BinTree Right;
};
//******************************************************************************
typedef struct Node* PtrToNode;//定义队列结构类型
struct Node{ //队列中的结点
 BinTree bt;
 PtrToNode Next;
};
typedef struct QNode* PtrToQNode;
struct QNode{
 PtrToNode Rear;
 PtrToNode Front;
};
typedef PtrToQNode Queue;
Queue CreatQueue()
{
 Queue Q;
 Q=(Queue)malloc(sizeof(struct QNode));
 Q->Rear=Q->Front=NULL;
 return Q;
}
void PrintZ(BinTree BT);
bool IsEmpty(Queue Q)
{
 return (Q->Front==NULL);
}
BinTree DeleteQ(Queue Q)
{
 PtrToNode FrontCell;
 BinTree FrontElem;
 if(IsEmpty(Q)){
  printf("队列空!\n");
  return NULL;
 }else{
  FrontCell=Q->Front;
  if(Q->Front==Q->Rear)
   Q->Front=Q->Rear=NULL;
  else
   Q->Front=Q->Front->Next;
  FrontElem=FrontCell->bt;
  free(FrontCell);
  return FrontElem;
 }
}
void AddQ(Queue Q,BinTree BT)//压入结点地址
{
 PtrToNode tem;
 tem=(PtrToNode)malloc(sizeof(struct Node));
 tem->bt=BT;
 tem->Next=NULL;
 if(Q->Front==NULL){
  Q->Front=Q->Rear=tem;
 }else{
 Q->Rear->Next=tem;
 Q->Rear=tem;
 }
}
void Print(BinTree BT)//输出二叉树中的值 //***************先序遍历******************//
{
 if(BT){
  printf("%d ",BT->Data);
  Print(BT->Left);
  Print(BT->Right);
 }
}
void PrintZ(BinTree BT)//输出二叉树中的值 //***************中序遍历******************//
{
 if(BT->Data ){
  Print(BT->Left);
  printf("%d ",BT->Data);
  Print(BT->Right);
 }
}
void PrintH(BinTree BT)//输出二叉树中的值 //**************后序遍历******************//
{
 if(BT){
  Print(BT->Left);
  Print(BT->Right);
  printf("%d ",BT->Data);
 }
}
//********************************************************************************
BinTree CreatBinTree()
{
 int Data;
 BinTree BT,T;
 Queue Q=CreatQueue();//创建空队列
 //建立第1个结点,即根节点
 scanf("%d",&Data);
 if(Data!=0){
  //分配根结点单元,并将结果地址入队
  BT=(BinTree)malloc(sizeof(struct TNode));
  BT->Data=Data;
  BT->Left=BT->Right=NULL;
  AddQ(Q,BT);
 }
 else{
  return NULL;//若第一个数据就是0,则返回空树
 }
 int count=0;
 while(!IsEmpty(Q)){
  count++;
  T=DeleteQ(Q);//从队列中取出一结点地址
  scanf("%d",&Data);//读入T的左孩子
  if(Data==NoInfo){
   T->Left==NULL;
  }else{
   T->Left=(BinTree)malloc(sizeof(struct TNode));
   T->Left->Data=Data;
   T->Left->Left=T->Left->Right=NULL;
   AddQ(Q,T->Left);
  }
  scanf("%d",&Data);//读入T的右孩子
  if(Data==NoInfo){
   T->Right==NULL;
  }else{//分配新结点,作为队结点右孩子,新结点入队
   T->Right=(BinTree)malloc(sizeof(struct TNode));
   T->Right->Data=Data;
   T->Right->Left=T->Right->Right=NULL;
   AddQ(Q,T->Right);
  }
 }
 return BT;
 }
void zuo(BinTree S)
{
 cout<<"\n";
 while(S){
  printf("%d\n",S->Data);
  S=S->Left;
 }
 printf("\n\n");
}
void you(BinTree S)
{
 while(S){
  printf("%d\n",S->Data);
  S=S->Right;
 }
}
int main()
{
 freopen("C:\\Users\\Administrator\\Desktop\\text.txt","r",stdin);
 BinTree Head=CreatBinTree();
 cout<<"先序遍历\n";
 Print(Head);
 printf("\n\n");
 cout<<"中序遍历\n";
 PrintZ(Head);
 printf("\n\n");
 cout<<"后序遍历\n";
 PrintH(Head);
 zuo(Head);
 you(Head);
 free(Head);
 return 0;
}
0 0
原创粉丝点击