PAT 1102 Invert a Binary Tree (25分) 反转二叉树

使用递归思想反转二叉树是非常简单的,很容易能想到。写一个递归函数,第一步交换左子树与右子树。第二步分别递归左子树与右子树,即交换左子树的左子树与右子树,交换右子树的左子树和右子树,。。。。如此层层递归直到达到设置的退出条件。

反转二叉树代码如下

void invert(node* root){
    if(root==nullptr)return;
    node* temp;
    temp=root->lchild;
    root->lchild=root->rchild;
    root->rchild=temp;
    invert(root->lchild);
    invert(root->rchild);
}

本题涉及到数据的输入,与二叉树的创建。其完整代码如下

#include <iostream>
#include <queue>
#include <map>
using namespace std;
struct node{
    int data;
    node* lchild;
    node* rchild;
};
int n;
int num=0;
void inorder(node* root){
    if(root== nullptr)return;
    inorder(root->lchild);
    printf("%d",root->data);
    num++;
    if(num<n){
        printf(" ");
    }
    inorder(root->rchild);

}
int num1=0;
void levelorder(node* root){
    queue<node*> q;
    q.push(root);
    while(!q.empty()){
        node* temp =q.front();
        q.pop();
        printf("%d",temp->data);
        num1++;
        if(num1<n)printf(" ");
        if(temp->lchild!= nullptr)q.push(temp->lchild);
        if(temp->rchild!= nullptr)q.push(temp->rchild);
    }
}
void invert(node* root){
    if(root==nullptr)return;
    node* temp;
    temp=root->lchild;
    root->lchild=root->rchild;
    root->rchild=temp;
    invert(root->lchild);
    invert(root->rchild);
}
map<int,node*> m;
bool flag[10]={false};
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        node* tmp=new node;
        m[i]=tmp;
        m[i]->data=i;
        m[i]->lchild= nullptr;
        m[i]->rchild= nullptr;
    }
    char c1,c2;
    for(int i=0;i<n;i++){
        cin>>c1>>c2;
        if(c1!='-'){
            m[i]->lchild=m[c1-'0'];
            flag[c1-'0']=true;
        }
        if(c2!='-'){
            m[i]->rchild=m[c2-'0'];
            flag[c2-'0']=true;
        }
    }
    node* root;
    for(int i=0;i<n;i++){
        if(!flag[i]){
            root=m[i];
        }
    }
    invert(root);
    levelorder(root);
    printf("\n");
    inorder(root);
    return 0;
}

 

posted @ 2020-08-22 16:23  uy9ko  阅读(119)  评论(0)    收藏  举报