欢迎光临散文网 会员登陆 & 注册

【PAT A1020】 Tree Traversals

2023-03-01 19:44 作者:仓鼠翞  | 我要投稿

//给定二叉树的先序序列和中序序列,求二叉树的层序遍历序列
//输入;
//7
//1 2 3 4 6 7 5
//2 1 6 4 7 3 5
//1 2 3 4 5 6 7
//输出
#include<cstdio>
#include<queue>
using namespace std;
int n;//二叉树的节点数
int x[10];//存放先序序列
int z[10];//存放中序序列
struct TreeNode
{
   int data;//节点信息
   TreeNode * leftchild;
   TreeNode * rightchild;
};
TreeNode* creat(int preL,int preR,int inL , int inR)//preL为先序做区间因由此类推
{
   if(preL>preR)
   {
       return NULL;
   }
   TreeNode * root = new TreeNode;
   root -> data = x[preL];//先序的第一个元素就是根
   int k;//查找和先序第一个元素相同的元素于后序序列中下标用k保存
   for(int i=inL;i<=inR;i++)
   {
       if(z[i] == x[preL])
       {
           k=i;
           break;//找到则退出循环
       }
   }
   int numleft = k -inL;//左子树的节点个数
   //左子树的先序区间为{preL+1,preL+numleft},中序区间为{inL,k-1}递归调用返回作为左子树
   root -> leftchild = creat(preL+1,preL+numleft,inL,k-1);
   //右子树的先序区间为{preL+numleft+1,preR},中序区间为{k+1,inR}
   root -> rightchild = creat(preL+numleft+1,preR,k+1,inR);
   //返回根节点的位置
   return root;
}
void levelTraverse(TreeNode * root)
{
   queue<TreeNode *> myqueue;
   myqueue.push(root);
   while(myqueue.empty() == false)//队列为空是假的即队列不空
   {
       TreeNode * Queuefront = myqueue.front();
       myqueue.pop();
       printf("%d ",Queuefront->data);
       if(Queuefront -> leftchild != NULL)
       {
           myqueue.push(Queuefront -> leftchild);
       }
       if(Queuefront -> rightchild != NULL)
       {
           myqueue.push(Queuefront -> rightchild);
       }
   }

}

int main()
{
   scanf("%d",&n);
   for(int i=1;i<=n;i++)
   {
       scanf("%d ",&x[i]);
   }
   for(int i=1;i<=n;i++)
   {
       scanf("%d ",&z[i]);
   }
   //用最终的根接受返回的根节点
   TreeNode * root = creat(1,n,1,n);
   //二叉树的层序遍历
   levelTraverse(root);
}

【PAT A1020】 Tree Traversals的评论 (共 条)

分享到微博请遵守国家法律