给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7 2 3 1 5 7 6 4 1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
数据结构杀疯了,对不起我真的不懂你TT
后序遍历+中序遍历思想:
知道这个思想之后,我们开始写后序遍历+中序遍历的代码:
递归思想
这个自己手写一下就能懂了(虽然我搞了无敌久才弄懂)
Tree PostAndIn(int front1,int rear1,int front2,int rear2) { Tree root=new struct TreeNode; root->data=Post[rear1]; root->left=root->right=NULL; int p=front2; while(In[p]!=Post[rear1]) p++; int num=p-front2;//左子树节点的个数 if(p!=front2) root->left=PostAndIn(front1,front1+num-1,front2,p-1); if(p!=rear2) root->right=PostAndIn(front1+num,rear1-1,p+1,rear2); return root; }
接下来就是层序遍历了,其实很简单,层序遍历就是从上到下,从左到右输出,like:
这棵二叉树的层序遍历序列就是 [ 1 , 4 , 2 , 7 , 20 , 5 ]
层序遍历我们一般用队列实现:
// 0. 声明队列 queue<Tree> t; // 1. 将根节点加入队列 t.push(root); // 2. 遍历队列中每个节点 while(!t.empty()) { root=t.front(); //3.记录当前根节点值 t.pop(); //4.删除根节点值 cout<<root->data; //5.输出根节点值(题目要求) if(root->left) //如果此时的根节点有左孩子 t.push(root->left); //将左孩子加入队列中 if(root->right) //同上 t.push(root->right); if(!t.empty()) //控制输出格式 cout<<" "; }
主函数中直接调用这两个函数即可
完整代码:
#include <bits/stdc++.h> using namespace std; int Post[35],In[35]; typedef struct TreeNode { int data; TreeNode *left; TreeNode *right; }Node,*Tree ; //Node=struct TreeNode //*Tree是指向该结构体的指针,即给struct TreeNode * 取个别名为*Tree Tree PostAndIn(int front1,int rear1,int front2,int rear2) { Tree root=new struct TreeNode; root->data=Post[rear1]; root->left=root->right=NULL; int p=front2; while(In[p]!=Post[rear1]) p++; int num=p-front2;//左子树节点的个数 if(p!=front2) root->left=PostAndIn(front1,front1+num-1,front2,p-1); if(p!=rear2) root->right=PostAndIn(front1+num,rear1-1,p+1,rear2); return root; } void Sequence(Tree root) { queue<Tree> t; if(root) t.push(root); while(!t.empty()) { root=t.front(); t.pop(); cout<<root->data; if(root->left) t.push(root->left); if(root->right) t.push(root->right); if(!t.empty()) cout<<" "; } } int main() { int n,i; cin>>n; for(i=0;i<n;i++) { cin>>Post[i]; } for(i=0;i<n;i++) { cin>>In[i]; } Tree root=PostAndIn(0,n-1,0,n-1); Sequence(root); return 0; }