交换左右子树

设有一棵二叉树,其节点值为字符型并假设各值互不相等,采用二叉链表存储表示。现输入其扩展二叉树的前序遍历序列,要求编写一个算法交换二叉树中所有节点的左右子树,并输出交换后的前序遍历。

 Input

输入的第一行为一个整数n,表示接下来有n组数据。
接下来n组,每组占一行,每行包含一个扩展二叉树的前序遍历

 Output

对于每组数据,若二叉树不为空,输出交换完左右子树后的前序遍历,每组输出占一行;否则,不输出任何信息。

 Sample Input

2
AB#D##C##
ABD##E##C#F##

 Sample Output

ACBD
ACFBED

 

#include<iostream>
#include<stdio.h>
using namespace std;
struct BiNode{
        char data;
        BiNode *l,*r;
        BiNode(){
                l=r=NULL;
        }
};
class Tree{
public:
        Tree(){
                root=Creat();
        }
        void Delete(char x,int flag){
                Delete(x,flag,root);
        }
        void PreOder(){
            if(root){

                PreOder(root);
                  cout<<endl;
            }
        }
        void exchange(){

        exchange(root);
        }
        ~Tree(){
                Release(root);
        }
private:
        BiNode *root;
        BiNode* Creat(){
                BiNode *bt;
                char ch;
                cin>>ch;
                if(ch=='#'){
                        bt=NULL;
                }else{
                        bt=new BiNode;
                        bt->data=ch;
                        bt->l=Creat();
                        bt->r=Creat();
                }
                return bt;
        }

        void exchange(BiNode* &bt){

        if(bt){
            exchange(bt->l);
            exchange(bt->r);
            BiNode* temp=bt->l;
            bt->l=bt->r;
            bt->r=temp;
        }
        }

        void Release(BiNode *bt){
                if(bt){
                        Release(bt->l);
                        Release(bt->r);
                        delete bt;
                }
        }
        int Delete(char x,int flag,BiNode*& bt){
                if(bt==NULL){
                        return 0;
                }
                if(bt->data==x){
                        flag=1;
                }
                int left=Delete(x,flag,bt->l);
                int right=Delete(x,flag,bt->r);
                if(flag==1){
                        if(bt->data==x){
                                return 1;
                        }
                        delete bt;
                }else{
                        if(left==1){
                                bt->l=NULL;
                        }
                        if(right==1){
                               bt->r=NULL;
                        }
                }
                return 0;
        }
        void PreOder(BiNode *bt){
                if(bt){
                        cout<<bt->data;
                        PreOder(bt->l);
                        PreOder(bt->r);
                }
        }

};
int main()
{
  
        int n;
        while(cin>>n){
                while(n--){
                        Tree t;


                       t.exchange();
                        t.PreOder();

                }
        }
        return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haibianyoushark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值