//此為多文件結構
//binarry.h
#pragma once
#include <iostream>
#include <tchar.h>
#include <stdio.h>
using namespace std;
//BiTree_Node.h
#pragma once
#include "binarry_tree.h"
//樹的結點類型
typedef struct Binarry_Tree
{
int data;//結點記錄
Binarry_Tree *left;//左子樹
Binarry_Tree *right;//右子樹
}*Bi_Tree;
//Queue_Link.h
#pragma once
#include "BiTree_Node.h"
//隊列結點
typedef struct Queue_Node
{
Bi_Tree treenode;//樹結點
Queue_Node *next;//隊列結點的后繼
}*Q_Node;//隊列結點類型
//隊列類型
typedef struct Queue
{
Q_Node head;//頭指針
Q_Node tail;//尾指針
}*_Queue;//隊列類型
//創建隊列
void Create_Queue(_Queue &queue)
{
queue = new Queue;
queue->head = NULL;
queue->tail = NULL;
}
//創建隊列結點
void Init_QNode(Q_Node &q_node)
{
q_node = new Queue_Node;
q_node->treenode = NULL;
q_node->next = NULL;
}
//賦值結點
void Set_QNode(Q_Node &q_node,Bi_Tree &treenode)
{
q_node->treenode = treenode;
}
//判斷隊是否為空
bool Queue_Empty(_Queue &queue)
{
if(queue->head == NULL)
return true;
else
return false;
}
//入隊
void En_Queue(_Queue &queue,Q_Node &q_node)
{
if(queue->head !=NULL)
{
queue->tail->next = q_node;
queue->tail = queue->tail->next;
}
else
{
queue->head = q_node;
queue->tail = q_node;
}
}
//出隊
void De_Queue(_Queue &queue,Q_Node &q_node)
{
if(queue->head != queue->tail)
{
q_node = queue->head;
queue->head = queue->head->next;
q_node->next = NULL;
}
else
{
q_node = queue->head;
queue->head = NULL;
queue->tail = NULL;
}
}
//隊列銷毀
void Destory_Queue(_Queue &queue)
{
Q_Node node;
while(!Queue_Empty(queue))
{
De_Queue(queue,node);
delete node;
}
delete queue;
}
//BiTree.h
#pragma once
#include "BiTree_Node.h"
#include "Queue_Link.h"
//創建結點
void Init_BiTree(Bi_Tree &tree)
{
tree = new Binarry_Tree;
tree->data = 0;
tree->left = NULL;
tree->right = NULL;
}
//創建二叉樹
void Create_tree(Bi_Tree &tree,int *pretraverse,int *intraverse,
int length)
{
if(pretraverse != NULL && intraverse != NULL && length>0)
{
int inrear = 0;
Init_BiTree(tree);
tree->data = pretraverse[0];
for(;;)
{
if(pretraverse[0] == intraverse[inrear] || inrear ==length)
{
break;
}
inrear++;
}
int leftlength = inrear;
if(leftlength > 0)
{
Create_tree(tree->left,pretraverse+1,intraverse,leftlength);
Create_tree(tree->right,pretraverse+leftlength+1,
intraverse+leftlength+1,length-leftlength-1);
}
}
}
//訪問結點
void visit(int data)
{
cout<<data<<" ";
}
//后序遍歷
void PostOrderTraverse(Bi_Tree &tree,void (*visit)(int))
{
if(tree != NULL)
{
if(tree->left != NULL)
PostOrderTraverse(tree->left,visit);
if(tree->right != NULL)
PostOrderTraverse(tree->right,visit);
visit(tree->data);
}
}
//層序遍歷
void LavalOrderTraverse(Bi_Tree tree,void (*visit)(int))
{
if(tree !=NULL)
{
_Queue queue;//隊列
Q_Node q_node;//隊列結點
Bi_Tree newtree = NULL;
Create_Queue(queue);
Init_QNode(q_node);
Set_QNode(q_node,tree);
En_Queue(queue,q_node);
while(!Queue_Empty(queue))
{
De_Queue(queue,q_node);
newtree = q_node->treenode;
visit(newtree->data);
if(newtree->left != NULL)
{
Init_QNode(q_node);
Set_QNode(q_node,newtree->left);
En_Queue(queue,q_node);
}
if(newtree->right != NULL)
{
Init_QNode(q_node);
Set_QNode(q_node,newtree->right);
En_Queue(queue,q_node);
}
}
Destory_Queue(queue);
}
}
//Binarry_Tree.cpp
//由樹的先序和中序遍歷生成樹的層序遍歷后序遍歷
//給定一棵樹的先序和中序的遍歷結果,構建二叉樹,並輸出這個棵樹的層序遍歷和后序遍歷結果
#include "BiTree.h"
int _tmain(int argc,_TCHAR* argv[])
{
int m = 0;//樹結點總數
Bi_Tree tree;
/*int pretraverse[15]= {1,2,4,8,9,5,10,11,3,6,12,13,7,14,15};//先序遍歷結果
int intraverse[15]= {8,4,9,2,10,5,11,1,12,6,13,3,14,7,15};//中序遍歷結果*/
int *pretraverse,*intraverse;//先序遍歷和中序遍歷結果
int *visitcout;//訪問記錄跟蹤標記
pretraverse = NULL;
intraverse = NULL;
visitcout = NULL;
cout<<"請輸入樹結點總數:"<<endl;
cin>>m;
if(m>0)
{
pretraverse = new int[m];
intraverse = new int[m];
}
cout<<"請輸入先序遍歷結果"<<endl;
for(int i=0;i<m;i++)
{
cin>>pretraverse[i];
}
cout<<"請輸入中序遍歷結果"<<endl;
for(int i=0;i<m;i++)
{
cin>>intraverse[i];
}
Create_tree(tree,pretraverse,intraverse,15);
cout<<"后序遍歷:"<<endl;
PostOrderTraverse(tree,visit);
cout<<endl<<"層序遍歷:"<<endl;
LavalOrderTraverse(tree,visit);
cout<<endl;
return 0;
}
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。