二叉树的建立,遍历,左右节点的交换

#include <stdio.h>
#include<math.h>
#include<stdlib.h>
#define ok 1
#define false 0
struct treenode
{
    char data;
    treenode* left;
    treenode* right;
};
typedef int status;
typedef treenode* Tree;
int main()
{
    status creat(Tree & T);
    status Preorder(Tree T);
    status Inorder(Tree T);
    status Postorder(Tree T);
    status exchange(Tree & T);
    printf("请按先序的顺序输入(#为空):");
    Tree T;
    creat(T);
    printf("先序输出:");
    Preorder(T);
    printf("\n中序输出:");
    Inorder(T);
    printf("\n后序输出:");
    Postorder(T);
    exchange(T);
    printf("\n将左右子树交换");
    printf("\n先序输出:");
    Preorder(T);
    printf("\n中序输出:");
    Inorder(T);
    printf("\n后序输出:");
    Postorder(T);
}

//先序建树
status creat(Tree& T)
{
    char a;
    scanf_s("%c", &a);
    if (a == '#')//#为空节点
    {
        T = NULL;
        return ok;
    }

    else
    {
        T = (treenode*)malloc(sizeof(treenode));
        if (!T)
            return OVERFLOW;
        T->data = a;
        creat(T->left);
        creat(T->right);
    }
    return ok;
}

//先序遍历
status Preorder(Tree T)
{
    if (T == NULL)
        return ok;
    else
    {
        printf("%c", T->data);
        Preorder(T->left);
        Preorder(T->right);
    }
    return ok;
}

//中序遍历
status Inorder(Tree T)
{
    if (T == NULL)
        return ok;
    else
    {
        Inorder(T->left);
        printf("%c", T->data);
        Inorder(T->right);
    }
    return ok;
}

//后序遍历
status Postorder(Tree T)
{
    if (T == NULL)
        return ok;
    else
    {
        Postorder(T->left);
        Postorder(T->right);
        printf("%c", T->data);
    }
    return ok;
}

//左右子树交换
status exchange(Tree& T)
{
    treenode* temp;
    if (T == NULL)
        return ok;
    else
    {
        temp = T->left;
        T->left = T->right;
        T->right = temp;
        exchange(T->left);
        exchange(T->right);
    }
    return ok;
}

调试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值