1. 程式人生 > 實用技巧 >PAT 1102 Invert a Binary Tree (25分) 反轉二叉樹

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