PAT (Advanced Level) Practice A1102 Invert a Binary Tree (25 分)(C++)(甲级)(二叉树)(层次遍历、中序遍历、二叉树翻转)
原题链接:A1102 Invert a Binary Tree#include<algorithm>#include<iostream>#include<cstdio>#include <queue>using namesp
·
原题链接:A1102 Invert a Binary Tree
#include<algorithm>
#include<iostream>
#include<cstdio>
#include <queue>
using namespace std;
typedef struct BiTNode
{
int data, is_root;//is_root是是否为根节点的标志位
struct BiTNode *lChild, *rChild;
}BiTNode, *BiTree;
BiTree Node[20];//存放每个节点
int N, root = 0, flag = 0;//root为根节点下标,flag控制输出格式
void reverseTree(BiTree T)//翻转二叉树,也可以不写,把两个遍历的顺序稍微修改一下就行
{
if(!T) return ;
BiTree temp = T->lChild;//先序思想
T->lChild = T->rChild;
T->rChild = temp;
reverseTree(T->lChild);
reverseTree(T->rChild);
}
void levelOrder(BiTree T)//层次遍历,用的队列的STL
{
queue<BiTree> Q;
Q.push(T);
while(!Q.empty())
{
BiTree temp = Q.front();
Q.pop();
if(flag) printf(" ");//打印时控制格式
printf("%d", temp->data);
flag = 1;
if(temp->lChild) Q.push(temp->lChild);
if(temp->rChild) Q.push(temp->rChild);
}
printf("\n");
}
void inOrder(BiTree T)//中序遍历
{
if(!T) return ;
inOrder(T->lChild);
if(flag) printf(" ");//注意格式
printf("%d", T->data);
flag = 1;
inOrder(T->rChild);
}
int main()
{
scanf("%d", &N);
char l_data, r_data;
for(int i=0; i<N; i++)//先为每个节点分配空间,并初始化是否为根节点的标志位
{
Node[i] = new BiTNode;
Node[i]->is_root = 1;
}
for(int i=0; i<N; i++)
{
getchar();//记得用getchar吸收回车
scanf("%c %c", &l_data, &r_data);
Node[i]->data = i;
if(l_data == '-') Node[i]->lChild = NULL;
else
{
Node[i]->lChild = Node[l_data - '0'];
Node[l_data - '0']->is_root = 0;//被指向的节点有父节点,不可能为根节点
}
if(r_data == '-') Node[i]->rChild = NULL;
else
{
Node[i]->rChild = Node[r_data - '0'];
Node[r_data - '0']->is_root = 0;
}
}
while(root<N && !Node[root]->is_root) root++;//查找根节点
reverseTree(Node[root]);//翻转之后两次遍历输出即可
levelOrder(Node[root]);//也可以不翻转,把两个遍历中的递归次序换一下就行了
flag = 0;
inOrder(Node[root]);
return 0;
}
//不用reverseTree函数的方法
#include<algorithm>
#include<iostream>
#include<cstdio>
#include <queue>
using namespace std;
typedef struct BiTNode
{
int data, is_root;//is_root是是否为根节点的标志位
struct BiTNode *lChild, *rChild;
}BiTNode, *BiTree;
BiTree Node[20];//存放每个节点
int N, root = 0, flag = 0;//root为根节点下标,flag控制输出格式
void levelOrder(BiTree T)//层次遍历,用的队列的STL
{
queue<BiTree> Q;
Q.push(T);
while(!Q.empty())
{
BiTree temp = Q.front();
Q.pop();
if(flag) printf(" ");//打印时控制格式
printf("%d", temp->data);
flag = 1;
if(temp->rChild) Q.push(temp->rChild);
if(temp->lChild) Q.push(temp->lChild);
}
printf("\n");
}
void inOrder(BiTree T)//中序遍历
{
if(!T) return ;
inOrder(T->rChild);
if(flag) printf(" ");//注意格式
printf("%d", T->data);
flag = 1;
inOrder(T->lChild);
}
int main()
{
scanf("%d", &N);
char l_data, r_data;
for(int i=0; i<N; i++)//先为每个节点分配空间,并初始化是否为根节点的标志位
{
Node[i] = new BiTNode;
Node[i]->is_root = 1;
}
for(int i=0; i<N; i++)
{
getchar();//记得用getchar吸收回车
scanf("%c %c", &l_data, &r_data);
Node[i]->data = i;
if(l_data == '-') Node[i]->lChild = NULL;
else
{
Node[i]->lChild = Node[l_data - '0'];
Node[l_data - '0']->is_root = 0;//被指向的节点有父节点,不可能为根节点
}
if(r_data == '-') Node[i]->rChild = NULL;
else
{
Node[i]->rChild = Node[r_data - '0'];
Node[r_data - '0']->is_root = 0;
}
}
while(root<N && !Node[root]->is_root) root++;//查找根节点
levelOrder(Node[root]);//也可以不翻转,把两个遍历中的递归次序换一下就行了
flag = 0;
inOrder(Node[root]);
return 0;
}
更多推荐
已为社区贡献10条内容
所有评论(0)