二叉树(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;
}
#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
- 二叉树(2)
- 二叉树(2)
- 二叉树(2)
- 树:二叉树几种形态(满二叉,完全二叉,线索二叉,二叉排序,平衡二叉,哈夫曼)
- 二叉树---(2)二叉查找树之Java实现
- 树(2)---二叉树
- 数据结构-二叉树(2)
- 数据结构---二叉树(2)
- 二叉树、满二叉树、完全二叉树、二叉排序树(二叉查找树)、平衡二叉树
- 二叉树、二叉排序树(二叉查找树)、平衡二叉树
- 二叉树,排序二叉树(续)
- 二叉树5(复制二叉树)
- 二叉树的宽度(二叉树)
- 复制二叉树(二叉树)
- 判满二叉树(二叉树)
- 二叉树(四)删除二叉树
- 二叉查找树(二叉搜索树)
- 二叉树(二叉链表实现)
- ZOJ-3715 Kindergarten Election(贪心+枚举)
- SDRAM
- wangzhao 筛选求解素数
- Android之AsyncTask的学习笔记
- 高德地图根据地名获取经纬度
- 二叉树(2)
- KNN-用于回归的python实现
- 关于linuxcast网站课程中MYSQL安装配置基础课程的个人笔记
- php中include、include_once、require、require_once等函数的异同
- 代理模式及具体实现
- linux中find命令和权限粘滞位解读
- 微信小程序开发指南
- 创建和删除新的数据表
- Oracle建立表空间和用户