您的位置:首页 > 其它

L2-011. 玩转二叉树

2017-02-28 20:17 281 查看

PATL2-011. 玩转二叉树

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

题解:

根据中序遍历(左中右),前序遍历(中左右);

由每次前序遍历区间的第一一个节点为跟节点,在中序遍历中找到这个节点即可将树的左子树和右子树区分,通过递归不断还原整棵树。

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <queue>
using namespace std ;
struct node
{
int l , r;
}tree[50];
int pre[50] , in[50]  , ans[50] , n;
int build(int prel , int prer , int inl , int inr)
{
if(inl > inr) return 0;
int root = pre[prel] , p1 , p2 ;
p1 = inl ;
while(in[p1] != root) p1 ++;
p2 = p1 - inl;
tree[root].l = build(prel+1,prel+p2,inl , p1 - 1);
tree[root].r = build(prel+p2+1,prer,p1+1 , inr);
return root;
}
void BFS()
{
queue<int> q ;
int tt = 0 ;
q.push(pre[0]);
int temp ;
while(!q.empty())
{
temp = q.front();
q.pop();
if(temp == 0) break ;
ans[tt++] = temp;
if(tree[temp].r!= 0)
{
q.push(tree[temp].r);
//ans[tt++] = tree[temp].r ;
}
if(tree[temp].l != 0)
{
q.push(tree[temp].l);
//ans[tt++] = tree[temp].l ;
}
}
for(int i = 0 ; i <tt ; i ++)
{
if(i == tt-1)
printf("%d\n" , ans[i]);
else
printf("%d " , ans[i]) ;
}
}
int main()
{
cin >> n ;
for(int i = 0 ; i < n ; i ++)
scanf("%d" , &in[i]) ;
for(int i = 0 ; i < n ; i++)
scanf("%d" , &pre[i]) ;
build(0 , n-1 , 0 , n-1);
BFS();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: