PAT:1020. Tree Traversals (25) AC

weixin_30639719發表於2020-04-05
#include<stdio.h>
#include<stdlib.h>
#include<queue>
using namespace std;

int POST[32];      //存放後序遍歷
int IN[32];        //存放中序遍歷
int n;          //節點數
struct node
{
  int data;
  node* l;
  node* r;
};

node* creat(int postL,int postR,int inL,int inR)
 {
  if(postL>postR)    //表明後續已經遍歷完了
    return NULL;
  node* root=(node*)calloc(1,sizeof(node));    //或者寫成  node* root=new node;  而calloc會自動初始化root更方便
  root->data=POST[postR];
  root->l=NULL;
  root->r=NULL;
  int tmp=0;      //標記postR這個元素在中序遍歷下的位置
  for(tmp=inL ; tmp<=inR ; ++tmp)
    if(IN[tmp]==root->data)
      break;
  int numleft=tmp-inL;  //【思維】後序遍歷中,前numleft個數字都是後續根的左子樹
  root->l=creat(postL, postL+numleft-1, inL, tmp-1);    //【caution】這裡的下標千萬注意!!!
  root->r=creat(postL+numleft , postR-1 , tmp+1 , inR);  //寫這步的時候最好畫圖
  return root;    //返回根地址
}

void BFS(node* root)
{
  queue<node*> q;    //建立佇列
  q.push(root);
  int num=0;      //記錄輸出個數,控制空格數量
  while(!q.empty())
  {
    ++num;
    node* tmp=q.front();
    q.pop();
    printf("%d",tmp->data);
    if(num<n)
      printf(" ");
    if(tmp->l!=NULL)
      q.push(tmp->l);
    if(tmp->r!=NULL)
      q.push(tmp->r);
  }
}

void DFS(node* root)
{
  if(root==NULL)
    return;
  printf("%d ",root->data);
  DFS(root->l);
  DFS(root->r);
}

int main()
{
  scanf("%d",&n);
  for(int i=0 ; i<n ; ++i)
    scanf("%d",&POST[i]);
  for(int i=0 ; i<n ; ++i)
    scanf("%d",&IN[i]);
  node* root=creat(0,n-1,0,n-1);

  //DFS(root);    //先序遍歷,測試建樹情況

  BFS(root);

  return 0;
}

轉載於:https://www.cnblogs.com/Evence/p/4319614.html

相關文章