由樹的先序和中序遍歷生成樹的層序遍歷后序遍歷


//此為多文件結構

//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;
}


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com