玩转二叉树
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N
(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
1 2 3 4 5 6 7
4 1 3 2 6 5 7
输出样例:
4 6 1 7 5 3 2
先通过题目给的两个序列建立二叉树,不需要进行镜面反转,只需要在层次遍历的时候先遍历右孩子再遍历左孩子即可,AC代码如下:
#include<iostream> using namespace std; typedef struct BiTNode { int data; struct BiTNode *lchild,*rchild; }BiTNode,*Bitree; Bitree CreatBitree(int *pre,int *in,int n) { Bitree T; int i; if(n <= 0) return NULL; T = new BiTNode; T -> data = pre[0]; for(i = 0;in[i] != pre[0]; i++); T -> lchild = CreatBitree(pre + 1,in,i); T -> rchild = CreatBitree(pre + 1 + i,in + 1 + i,n - 1 -i); return T; } void Levelorder(Bitree T) { int front = 0,rear = 0,first = 0; struct BiTNode *queue[100]; if(T == NULL) return; queue[rear++] = T; while(rear != front) { T = queue[front++]; if(T -> rchild) queue[rear++] = T -> rchild; if(T -> lchild) queue[rear++] = T -> lchild; if(first == 1) cout <<" "<< T -> data; if(first == 0) { cout << T -> data; first = 1; } } } int main() { Bitree T; int n; cin >> n; int prelist[35],inlist[35]; for(int i = 0;i < n; i++) cin >> inlist[i]; for(int i = 0;i < n; i++) cin >> prelist[i]; T = CreatBitree(prelist,inlist,n); Levelorder(T); return 0; }