1102 Invert a Binary Tree (25 分)
题目大意
给出原二叉树的每个结点的左右孩子,反转一棵二叉树,输出它的层序和中序遍历。
基本思路
数据结构:
一共有n个结点,0~n-1作为每个结点的结点编号。
定义结构体数组node[MAXN]来静态地存储这棵二叉树(用结点编号(数组下标)作为每个结点的结点值,它的左右孩子是它的左右孩子结点的结点编号(数组下标))。
定义数组exist,下标为结点编号,值为true表示这个结点是某个结点的孩子结点。
基本思路:
构建这棵二叉树L:读入所有结点的左右孩子结点,并把exsit[孩子结点]置为true,把结点自身的编号作为结点值。
找出二叉树的根结点编号root。
求层序序列的镜像序列。
求中序序列的镜像序列。
代码
具体数据结构和详细思路请看代码注释:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN=15;
int n;//结点个数(结点编号为0~n-1)
bool exsit[MAXN];//用来求出最终的根结点root
//利用结构体数组node[MAXN]静态存储这棵二叉树
struct NODE{
int data;//用自身的结点编号(数组node的下标)作为结点值
int l,r;//l、r也是结点编号
}node[MAXN];//下标是结点编号
int flag1=false;
void inorder(int root){
if(root==-1) return;
inorder(node[root].r);
if(flag1==false){
printf("%d",node[root].data);
flag1=true;
}
else{
printf(" %d",node[root].data);
}
inorder(node[root].l);
}
int main(){
cin>>n;
//读入所有数据,初始化静态二叉树
for(int i=0;i<n;i++){
node[i].data=i;
string s1,s2;
cin>>s1>>s2;
if(s1=="-") {
node[i].l=-1;
}
else{
node[i].l=stoi(s1);
exsit[node[i].l]=true;
}
if(s2=="-"){
node[i].r=-1;
}
else{
node[i].r=stoi(s2);
exsit[node[i].r]=true;
}
}
//找到这颗树的根结点编号
int root;
for(int i=0;i<n;i++){
if(exsit[i]==false){
root=i;
break;
}
}
//层次遍历
queue<int> q;
q.push(root);
bool flag=false;
while(!q.empty()){
NODE temp=node[q.front()];//取出队首结点
q.pop();//队首结点出队
//访问队首结点
if(flag==false) {
printf("%d",temp.data);
flag=true;
}
else printf(" %d",temp.data);
if(temp.r!=-1) q.push(temp.r);
if(temp.l!=-1) q.push(temp.l);
}
printf("\n");
//输出反转后二叉树的中序遍历
inorder(root);//中序遍历二叉树
printf("\n");
}