c++:交换二叉树中每个结点的左孩子和右孩子

交换二叉树中每个结点的左孩子和右孩子

以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。

输入格式:

输入二叉树的先序序列。

提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。

输出格式:

输出有两行:

第一行是原二叉树的中序遍历序列;

第二行是交换后的二叉树的中序遍历序列。

输入样例:

ABC##DE#G##F###

输出样例:

CBEGDFA
AFDGEBC

实现代码:

#include<bits/stdc++.h>
using namespace std;
typedef char TElemType;
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;

//先序遍历创建树
void CreateBiTree(BiTree &T)
{
    TElemType ch;
    cin>>ch;
    if(ch == '#')
        T = NULL;
    else
    {
        T = new BiTNode;
        T->data = ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}

//中序遍历输出树
void InOderTraverse(BiTree T)
{
    if(T)
    {
        InOderTraverse(T->lchild);
        cout << T->data;
        InOderTraverse(T->rchild);
    }
}

void DestroyBitree(BiTree& t)//销毁树
{
    if(t)
    {
        DestroyBitree(t->lchild);
        delete t;
        DestroyBitree(t->rchild);
    }
}

//交换结点的左右孩子
void exchange_child(BiTree &T)
{
    BiTree t;
    if(!T)
        return ;
    else
    {
        if(T->lchild && T->rchild)
        {
            t = T->rchild;
            T->rchild = T->lchild;
            T->lchild = t;
        }
        else if(T->lchild==NULL && T->rchild)
        {
            T->lchild = T->rchild;
            T->rchild = NULL;
        }
        else if(T->rchild==NULL && T->lchild)
        {
            T->rchild = T->lchild;
            T->lchild = NULL;
        }
        exchange_child(T->lchild);
        exchange_child(T->rchild);

    }
}


int main()
{
    BiTree T;
    CreateBiTree(T);
    InOderTraverse(T);
    cout << endl;
    //printTree(T);

    exchange_child(T);
    InOderTraverse(T);
    cout << endl;
    //printTree(T);
    DestroyBitree(T);
    return 0;
}

结果:
在这里插入图片描述

打印输出树的函数:

void printTree(BiTNode *root, int deep = 1, string code=".")
{
    /*
     //*打印这颗二叉树
     //* @root 树的根节点
     //* @deep 此节点的深度
     //* @code 从根节点遍历到此处的路径码,向左用0表示,向右用1表示*/

    if (!root)
    {
        return;
    }
    printTree(root->rchild, deep+1, code+"1");
    for (int i = 0; i < deep; ++i)
    {
        // printf(i==deep-1?"+---": (code[i]==code[i+1]?"     ":"|    "));
        printf(i==deep-1?(code[i]=='1'?"┌────":"└────"): (code[i]==code[i+1]?"     ":"│    "));
    }
    printf("(%c)\n", root->data);

    printTree(root->lchild, deep+1, code+"0");
 }

运行结果:
在这里插入图片描述
学长写的交换函数:

void exchange_child(BiTree &T)
{
    if(T)
    {
        swap(T->lchild,T->rchild);
        exchange_child(T->lchild);
        exchange_child(T->rchild);
    }
}

总结:

  1. 交换时分清楚交换的对象。
  2. swap(a,b)函数:交换a,b的值。
  • 6
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值