[PAT Class A tree traversal C ++] 1102 Inverser un arbre binaire (25 points)

D'accord, j'ai AC, je suis meilleur que Max Howell (tête de chien)

Lors de la construction d'un arbre, retournez simplement l'établissement, inversez simplement les deux champs de pointeur, puis parcourez simplement dans l'ordre normal. C'est Max Howell? (Doghead sauve ta vie !!!!!! Drôle)

# 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;
}

Au lieu de retourner pendant la construction de l'arbre, après la construction normale de l'arbre, la traversée post-ordre est utilisée pour inverser l'arbre binaire (la traversée de pré-ordre est également possible, mais après chaque retournement, elle ne répond pas à la définition de la traversée de pré-commande, mais l'effet n'est pas un problème)

# 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;
}

Je suppose que tu aimes

Origine blog.csdn.net/MYMarcoreus/article/details/113898219
conseillé
Classement