学习日记五:层次建立二叉树
1.先建立根节点,根节点数据为0则为空树,返回NULL根结点地址压入队。
2.如果队列不为空,出队,记录出队结点地址
读入数据,如果不为0,给出队结点左孩子开辟空间并赋值,然后将左孩子地址入队
读入数据如果不为0,给出队结点右孩子开辟空间并赋值,然后将右孩子地址入队。
3.重复步骤2,直到队列为空。
层次建立大致就这个方法吧,方法并不难,可代码老写错。
建立队列时,第一次我先给队列的队首队尾赋初值0了,入队:读入数据,队尾加1。出队:返回数据,队首加1。
判断队列为空条件队首队尾下标相同。
目前还不知道错误原因
第二次给队列的队首赋初值0,队尾赋初值-1,入队:队尾加1,读入数据。 出队:返回数据,队首加1.
判断队列为空条件:队首下标大于队尾下标
这次对了。两个结果对比一下。(中序遍历二叉树)
正确的代码:
程序代码:
#include <stdio.h> #include <stdlib.h> #define MaxSize 30 typedef struct QueueNode* PtrQType ; typedef struct BinTreeNode* PtrBTType ; //二叉树结点结构体 struct BinTreeNode { int BTNodeData ; struct BinTreeNode* Right; struct BinTreeNode* Left ; } ; //顺序队列 struct QueueNode { struct BinTreeNode* AddressData[MaxSize] ;//指针数组,数组中保存的是地址 int rear ; int front ; } ; //队列的初始化 PtrQType InitializeQ( ) { PtrQType Q ; Q = (PtrQType)malloc( sizeof(struct QueueNode) ); Q->rear = -1 ; Q->front= 0 ; return Q ; } //队列是否为空 int IsEmptyQ( PtrQType Q ) { if( Q->front > Q->rear ) return 1 ; else return 0 ; } //队列是否已满 int IsFullQ( PtrQType Q ) { if(Q->rear == MaxSize-1 ) return 1 ; else return 0 ; } //入队 void AddQ( PtrQType Q , struct BinTreeNode* T) { int IsFullQ( PtrQType Q ) ;//函数声明 if( !IsFullQ( Q )) { Q->rear++ ; Q->AddressData[Q->rear] = T ; } else printf("队列已满,停止添加数据\n") ; } //出队,并返回队列结点数据(地址) PtrBTType DeleteQ( PtrQType Q ) { int IsFullQ( PtrQType Q ) ;//函数声明 int i ; i = Q->front ; if( !IsEmptyQ(Q) ) { Q->front++ ; return Q->AddressData[ i ] ; } else printf("队列已空\n"); } //层序建立二叉树 PtrBTType CreateBT( ) { void AddQ( PtrQType Q , struct BinTreeNode* T) ; PtrBTType DeleteQ( PtrQType Q ) ; PtrQType InitializeQ( ) ; int IsEmptyQ( PtrQType Q ) ; int Data ; PtrBTType BT , T ; PtrQType Q ; //初始化队列 Q = InitializeQ( ) ; //输入根结点数据 BT = ( PtrBTType )malloc(sizeof(struct BinTreeNode)) ; // BT->Left = NULL ; // BT->Right = NULL ; scanf("%d",&BT->BTNodeData ) ; if( BT->BTNodeData )//如果根节点数据不为0,将根节点地址入队,否则返回空树 AddQ( Q, BT ) ; else return NULL ; while( !IsEmptyQ(Q) )//当队列不为空 { //初始化左右儿子结点 T = DeleteQ( Q ) ; scanf("%d",&Data) ;//输入左儿子结点数据 if(Data) { T->Left = ( PtrBTType )malloc(sizeof(struct BinTreeNode)) ; T->Left->BTNodeData = Data ; //T->Left->Left = T->Left->Right = NULL ; AddQ( Q,T->Left ) ; } else T->Left = NULL ; scanf("%d",&Data) ;//输入右儿子结点数据 if(Data) { T->Right = ( PtrBTType )malloc(sizeof(struct BinTreeNode)) ; T->Right->BTNodeData = Data ; //T->Right->Left = T->Right->Right = NULL ; AddQ( Q,T->Right ) ; } else T->Right = NULL ; } return BT ; } void InOrderTraversal( PtrBTType BT ) { if(BT) { InOrderTraversal( BT->Left ) ; printf("%d ",BT->BTNodeData ) ; InOrderTraversal( BT->Right ) ; } } int main() { PtrBTType BT ; printf("请输入树(层次建立)\n") ; BT = CreateBT() ; //中序遍历 InOrderTraversal(BT); }
错误的代码:
程序代码:
#include <stdio.h> #include <stdlib.h> #define MaxSize 30 typedef struct QueueNode* PtrQType ; typedef struct BinTreeNode* PtrBT ; //二叉树结点结构体 struct BinTreeNode { int BTNodeData ; struct BinTreeNode* Right; struct BinTreeNode* Left ; } ; //顺序队列 struct QueueNode { struct BinTreeNode* AddressData[MaxSize] ;//指针数组,数组中保存的是地址 int rear ; int front ; } ; //队列的初始化 PtrQType CreateQueue( ) { PtrQType PtrQ ; PtrQ=(struct QueueNode*)malloc(sizeof(struct QueueNode)); PtrQ->front=0 ; PtrQ->rear=0 ; return PtrQ ; } //入队 void AddQ( PtrQType PtrQ , struct BinTreeNode* a ) { int IsFull( PtrQType PtrQ ) ; //判断队列是否已满 if( !IsFull(PtrQ) )//没满添加数据 { (PtrQ->AddressData[PtrQ->rear]) = a ; (PtrQ->rear)++ ; } else printf("队列已满,停止入队\n"); } //出队,并返回队首(树的地址) PtrBT DeleteQ( PtrQType PtrQ ) { int i ; if( !IsEmpty(PtrQ) ) { i=PtrQ->front ; PtrQ->front++ ; return PtrQ->AddressData[i] ; } else printf("队列已空\n") ; } //队列是否已满 int IsFull( PtrQType PtrQ ) { if (PtrQ->rear == MaxSize-1) return 1 ; else return 0 ; } //队列已空 int IsEmpty( PtrQType PtrQ ) { if( PtrQ->front == PtrQ->rear ) return 1 ; else return 0 ; } PtrBT CreateBinTree( ) { //函数声明 PtrQType CreateQueue( ) ; //队列初始化 void AddQ( PtrQType PtrQ , struct BinTreeNode* a ) ; //入队 PtrBT DeleteQ( PtrQType PtrQ ) ; //出队 int Data ; PtrBT BT,T ; PtrQType PtrQ ; BT = NULL ; //树的初始化 T = NULL ; PtrQ = CreateQueue() ; scanf("%d",&Data) ; //读入数根节点数据,数据为0则输出空树 if( Data ) { BT = ( PtrBT )malloc(sizeof(struct BinTreeNode) ) ; BT->BTNodeData = Data ; BT->Left = BT->Right = NULL; AddQ( PtrQ , BT ) ; } else return NULL ; while( !IsEmpty(PtrQ) ) //当队列非空时执行... { T = DeleteQ( PtrQ ) ; //弹出队首,地址赋给指针T scanf("%d",&Data) ; //读入左儿子结点数据 if( Data ) //左儿子结点读入数据,并将左儿子结点指针入队 { T->Left = ( PtrBT )malloc(sizeof(struct BinTreeNode) ) ; T->Left->BTNodeData = Data ; T->Left->Left = T->Left->Right = NULL; AddQ( PtrQ , T->Left ) ; } else T->Left=NULL ; T = DeleteQ( PtrQ ) ; scanf("%d",&Data) ; //读入右儿子结点数据 if( Data ) //右儿子结点读入数据,并将右儿子结点指针入队 { T->Right = ( PtrBT )malloc(sizeof(struct BinTreeNode) ) ; T->Right->BTNodeData = Data ; T->Right->Left = T->Right->Right = NULL; AddQ( PtrQ , T->Right ) ; } else T->Right=NULL ; } return BT ; } void InOrderTraversal( PtrBT BT ) { if(BT) { InOrderTraversal(BT->Left); printf("%d ",BT->BTNodeData); InOrderTraversal(BT->Right); } } int main( ) { PtrBT BT ; printf("请输入树(层次建立)\n") ; BT = CreateBinTree() ; //中序遍历 InOrderTraversal(BT); printf( "层次输出树:\n" ) ; // PrintfBT( BT ) ; }