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; }
相关文章推荐
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- pat 团体天梯赛 L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- PAT L2-011. 玩转二叉树
- PTA L2-011 玩转二叉树 (镜像反转)
- L2-011. 玩转二叉树
- PAT L2-011. 玩转二叉树
- L2-011. 玩转二叉树 (树的层序遍历)
- L2-011. 玩转二叉树(二叉树的遍历)
- PAT - L2-011. 玩转二叉树(分冶)
- 天梯赛 L2-011. 玩转二叉树(数据结构)
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- 团体程序设计天梯赛-练习集L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- PAT - 天梯赛 L2-011 玩转二叉树
- L2-011. 玩转二叉树