题目描述:给出一个N,表示结点数,然后第二行给出层序遍历,第三行给出中序遍历,求该树的前序遍历。样例:
7
3 5 4 2 6 7 1
2 5 3 6 4 7 1
首先我们可以根据层序的最前面的结点找到根结点,然后下一个结点所在的位置与中序中的位置有关。例如:由层序知根结点是3,然后5是3的子结点。因为在中序中5在3的左边,所以5是3的左结点。
然后层序的下一个结点是4,在中序中4在3的右边
下一个结点是2,中序中2在5的左边:
层序下一个是6,中序中6在3的右边,在4的左边:
接下来的两个也是相同的办法:
代码:
#include<cstdio>
#include<vector>
using namespace std;
struct node{
int data;
node * left, * right;
};
vector<int> level;
int pos[110], n;
node * root = NULL;
node * create(int index, node * &root)
{
if(root == NULL)
{
root = new node;
root->left = root->right = NULL;
root->data = level[index];
return root;
}
if(pos[root->data] > pos[level[index]])
create(index, root->left);
else
create(index, root->right);
return root;
}
int cnt = 0;
void DFS(node * root)
{
if(root == NULL)
return;
printf("%d", root->data);
cnt++;
if(cnt < n)
printf(" ");
DFS(root->left);
DFS(root->right);
}
int main()
{
scanf("%d", &n);
level.resize(n+1);
int num;
for(int i = 1; i <= n; i++)
scanf("%d", &level[i]);
for(int i = 1; i <= n; i++)
{
scanf("%d", &num);
pos[num] = i;
}
for(int i = 1; i <= n; i++)
create(i, root);
DFS(root);
}