二叉树的左右子树交换

这本是个简单问题,但网上却没有个统一的说法

C++语言: Codee#22991
#include <stdio.h>
#include <malloc.h>

typedef struct node
{
    char data;
    struct node *lchild;
    struct node *rchild;
} BTNode;
void CreateBTNode(BTNode * &b, char *str)
{
    BTNode *St[10086], *p = NULL;
    int top = -1, k, j = 0;
    char ch;
    b = NULL;
    ch = str[j];
    while (ch != '\0')
    {
        switch(ch)
        {
        case '(':
            top++;
            St[top] = p;
            k = 1;
            break;
        case ')':
            top--;
            break;
        case ',':
            k = 2;
            break;
        default:
            p = (BTNode *)malloc(sizeof(BTNode));
            p->data = ch;
            p->lchild = p->rchild = NULL;
            if (b == NULL)
                b = p;
            else
            {
                switch(k)
                {
                case 1:
                    St[top]->lchild = p;
                    break;
                case 2:
                    St[top]->rchild = p;
                    break;
                }
            }
        }
        j++;
        ch = str[j];
    }
}

void DispBTNode(BTNode *b, int dep)
{
    if (b != NULL)
    {
        DispBTNode(b->lchild, dep + 2);
        printf("%.*s%c\n",  dep, "                 ", b->data);
        DispBTNode(b->rchild, dep + 2);
    }
}
void exch_pre(BTNode* b)
{
    BTNode* tmp;
    if(b)
    {
        tmp = b->lchild;
        b->lchild = b->rchild;
        b->rchild = tmp;
        exch_pre(b->lchild);
        exch_pre(b->rchild);
    }
}

void exch_in(BTNode* b)
{
    BTNode* tmp;
    if(b)
    {
        exch_pre(b->lchild);
        tmp = b->lchild;
        b->lchild = b->rchild;
        b->rchild = tmp;
        exch_pre(b->lchild);     //!!!!!!!
    }
}

void exch_post(BTNode* b)
{
    BTNode* tmp;
    if(b)
    {
        exch_pre(b->lchild);
        exch_pre(b->rchild);
        tmp = b->lchild;
        b->lchild = b->rchild;
        b->rchild = tmp;
    }
}
void exch_lv(BTNode* b)
{
    BTNode* tmp_q[10086];
    BTNode* ptr;
    BTNode* t;
    int front, rear;
    front = rear = 0;
    tmp_q[++rear] = b;
    while(front < rear)
    {
        ptr = tmp_q[++front];
        t = ptr->lchild;
        ptr->lchild = ptr->rchild;
        ptr->rchild = t;
        if(ptr->lchild)
            tmp_q[++rear] = ptr->lchild;
        if(ptr->rchild)
            tmp_q[++rear] = ptr->rchild;
    }
}




int main()
{
    BTNode *b;
    CreateBTNode(b, "A(B(D,E),C(,F))");
    printf("每次都是在上次交换的基础上再交换\n");
    printf("0.初始状态\n");
    DispBTNode(b, 0);
    puts("\n______________________________\n");

    exch_pre(b);
    printf("1.先序交换\n");
    DispBTNode(b, 0);
    puts("\n______________________________\n");

    exch_in(b);
    printf("2.中序交换\n");
    DispBTNode(b, 0);
    puts("\n______________________________\n");

    exch_post(b);
    printf("3.后序交换\n");
    DispBTNode(b, 0);
    puts("\n______________________________\n");

    exch_lv(b);
    printf("4.层次交换\n");
    DispBTNode(b, 0);
    puts("\n______________________________\n");

    return 0;
}
原文地址:https://www.cnblogs.com/invisible/p/2200117.html