原题链接: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;
}



Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐