玩转二叉树

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。 

输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

7
1 2 3 4 5 6 7
4 1 3 2 6 5 7

输出样例:

4 6 1 7 5 3 2

本题是天梯赛的竞赛试题,在这里给出题解。

乍一看是由中序遍历和先序遍历恢复一颗二叉树,然后在先序遍历或者后序遍历将所有节点的左右子树交换,然后再有层次遍历输出结果,这样一想就会觉得很麻烦,代码繁多,但是再仔细的看题,我们不难找出题目中的突破点,从镜面反转我们可以知道,反转后每一层的节点都会和原来的序列完全相反,因此或许我们可以不用写左右子树交换的代码,而是在层次遍历时做些手脚,每一层从最后一个节点开始遍历输出,也就是先右孩子在左孩子,这样一个小小的变动,瞬间就省去了很多麻烦,以下是我的代码。

#include 
#include 
typedef struct nold
{
    int data;
    struct nold *lchild,*rchild;
}Bitnold,*Bitree;
void creat(int prer[],int i,int j,int mid[],int k,int h,Bitnold **t)
{
    *t=(Bitnold*)malloc(sizeof(Bitnold));
    (*t)->data=prer[i];
    int m=k;
    while(prer[i]!=mid[m])
        m++;
    if(m==k)
        (*t)->lchild=NULL;
    else
       creat(prer,i+1,i+m-k,mid,k,m-1,&(*t)->lchild);
    if(m==h)
        (*t)->rchild=NULL;
    else
        creat(prer,i+m-k+1,j,mid,m+1,h,&(*t)->rchild);
}

int main()
{
    int i;
    Bitnold *root;
    int n;
    scanf("%d",&n);
    int mid[n];
    int prer[n];
    for(i=0;idata);
    /*Bitree stack[n];
    Bitree p=root;
    Bitree t;
    int top=-1;
  while(p!=NULL||top!=-1)
 {
    while(p!=NULL)
    {
        t=p->lchild;
        p->lchild=p->rchild;
        p->rchild=t;
        top++;
        stack[top]=p;
        p=p->lchild;
    }
    if(top<0)
    printf("666");
    else
    {
        p=stack[top];
        top--;
        p=p->rchild;
    }
  }
  printf("kfdshg");*/
  Bitree queue[n];
  int rear=0;
  int j=0;
  int front=-1;
  int arr[n];
  if(root!=NULL)
    queue[rear]=root;
  while(front!=rear)
  {
      front++;
      arr[j]=queue[front]->data;
      j++;
      if(queue[front]->rchild!=NULL)
      {
          rear++;
          queue[rear]=queue[front]->rchild;
      }
      if(queue[front]->lchild!=NULL)
      {
          rear++;
          queue[rear]=queue[front]->lchild;
      }
  }
 // printf("shgkljfdjllh");
  printf("%d",arr[0]);
  for(i=1;i

 

你可能感兴趣的:(玩转二叉树)