PAT_甲级_1102 Invert a Binary Tree

题目大意:

给定一个二叉树(编号从0到N-1),和每个结点的左右孩子编号,把该二叉树进行反转,然后输出反转二叉树的层序遍历和中序遍历

算法思路:

这个题目有两种方法可以求解,一是按照题目要求直接将二叉树进行反转获得新的二叉树,然后再遍历。第二种就是不改变二叉树,作镜像遍历,也即是之前先遍历左孩子,现在变成先遍历右孩子,毕竟只需要输出遍历的结果,就无需进行二叉树的反转,这里选择用第二种,当然了,如果想要反转的话,直接使用后序遍历的方法,在最后访问根节点的操作变化为交换其左右孩子节点即可($swap$函数就可以实现)。

获得根节点的方法:

这里使用了一个标记数组$isNotRoot$标记下标为i的节点是否为根节点,不是就是$true$,初始默认都是根节点,在每输入一行数据的时候,就说明当前的输入节点为其他节点的孩子节点,一定不是根节点,就将$isNotRoot$置为$true$,然后在输入完毕后,遍历$isNotRoot$查找为$false$的下标$i$即为$root$。(实际上是双亲表示法)

提交结果:

PAT_甲级_1102 Invert a Binary Tree_第1张图片

AC代码:

#include 
#include 
#include 
#include 

using namespace std;

struct Node{
    int data,left,right;
};

int N;// 节点个数
int root;// 根节点编号
bool isNotRoot[20];// 判断节点是否为根节点,不是就是true。
Node tree[20];

void levelTravese(){
    queue q;
    q.push(root);
    int num = 0;
    while (!q.empty()){
        int top = q.front();
        q.pop();
        printf("%d",top);
        if(num>s1>>s2;
        int left,right;
        tree[i].data = i;
        if(s1!="-"){
            // 是数字
            left = stoi(s1);
            isNotRoot[left] = true;// 为左孩子节点,一定不是根节点
            tree[i].left = left;
        } else {
            tree[i].left = -1;
        }
        if(s2!="-"){
            // 是数字
            right = stoi(s2);
            isNotRoot[right] = true;// 为左孩子节点,一定不是根节点
            tree[i].right = right;
        } else {
            tree[i].right = -1;
        }
    }
    // 找到根节点
    for (int j = 0; j < N; ++j) {
        if(!isNotRoot[j]){
            root = j;
            break;
        }
    }
    levelTravese();
    printf("\n");
    inOrder(root);
    return 0;
}

你可能感兴趣的:(算法-数据结构,二叉树,c++)