[PAT Clase A árbol transversal C ++] 1102 Invertir un árbol binario (25 puntos)

Está bien, tengo aire acondicionado, soy mejor que Max Howell (cabeza de perro)

Cuando construya un árbol, simplemente invierta el establecimiento, simplemente invierta los dos campos de puntero, y luego simplemente atraviese en el orden normal. ¿Ese es Max Howell? (¡¡¡¡Doghead salva tu vida !!!!!! Gracioso)

# include <bits/stdc++.h>
using namespace std;

int N;
int cnt;

struct Node{
    
    
    int l, r;
}node[10];

void levelOrder(int root){
    
    
    queue<int> Q;
    Q.push(root);
    int now = Q.front();
    while(!Q.empty()){
    
    
        now = Q.front();
        Q.pop();
        cout << now;
        ++cnt == N ? cout<<"\n" : cout<<" ";
        
        if(node[now].l != -1) Q.push(node[now].l);
        if(node[now].r != -1) Q.push(node[now].r);
    }
}

void inOrder(int root){
    
    
    if(root == -1) return;
    inOrder(node[root].l);
    cout << root;
    ++cnt == N ? cout<<"\n" : cout<<" ";
    inOrder(node[root].r);
    
}

int main(){
    
    
    scanf("%d\n", &N); // 输入树结点数量
    bool isChild[10] = {
    
    0}; // 记录
    for(int i = 0;i < N;++i){
    
    
        char left, right;
        scanf("%c %c\n", &left, &right);
        // 翻转指针域,建的树就直接是翻转二叉树。
        node[i].r = left  == '-' ? -1 : left -'0'; // 因为编号最多是个位数,所以可以直接减
        node[i].l = right == '-' ? -1 : right-'0';
        // 记录谁是别人的孩子,然后剩下的那一个不是别人的孩子的就是根节点
        if(node[i].l != -1) isChild[node[i].l] = true;
        if(node[i].r != -1) isChild[node[i].r] = true;
    }
    int R;
    for(int i = 0;i < N;++i){
    
    
        if(isChild[i] == false){
    
    
            R = i;
        }
    }
    cnt = 0;
    levelOrder(R);
    cnt = 0;
    inOrder(R);
    
        
    return 0;
}

En lugar de voltear durante la construcción del árbol, después de la construcción normal del árbol, el recorrido posterior al pedido se usa para voltear el árbol binario (el recorrido previo al pedido también es posible, pero después de cada giro, no cumple con la definición de recorrido previo al pedido, pero el efecto no es un problema)

# include <bits/stdc++.h>
using namespace std;

int N;
int cnt;

struct Node{
    
    
    int l, r;
}node[10];

void levelOrder(int root){
    
    
    queue<int> Q;
    Q.push(root);
    int now = Q.front();
    while(!Q.empty()){
    
    
        now = Q.front();
        Q.pop();
        cout << now;
        ++cnt == N ? cout<<"\n" : cout<<" ";
        
        if(node[now].l != -1) Q.push(node[now].l);
        if(node[now].r != -1) Q.push(node[now].r);
    }
}

void inOrder(int root){
    
    
    if(root == -1) return;
    inOrder(node[root].l);
    cout << root;
    ++cnt == N ? cout<<"\n" : cout<<" ";
    inOrder(node[root].r);
    
}

void postorder(int root){
    
     // 后序遍历翻转树
    if(root == -1) return;
    postorder(node[root].l);
    postorder(node[root].r);
    swap(node[root].l, node[root].r);
    
}

int main(){
    
    
    scanf("%d\n", &N); // 输入树结点数量
    bool isChild[10] = {
    
    0}; // 记录
    for(int i = 0;i < N;++i){
    
    
        char left, right;
        scanf("%c %c\n", &left, &right);
        node[i].l = left  == '-' ? -1 : left-'0'; // 因为编号最多是个位数,所以可以直接减
        node[i].r = right == '-' ? -1 : right-'0';
        // 记录谁是别人的孩子,然后剩下的哪一个不是别人的孩子的就是根节点
        if(node[i].l != -1) isChild[node[i].l] = true;
        if(node[i].r != -1) isChild[node[i].r] = true;
    }
    int R;
    for(int i = 0;i < N;++i){
    
    
        if(isChild[i] == false){
    
    
            R = i;
        }
    }
    postorder(R);
    cnt = 0;
    levelOrder(R);
    cnt = 0;
    inOrder(R);
    
        
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/MYMarcoreus/article/details/113898219
Recomendado
Clasificación