• 二叉树的左右子树交换


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

    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;
    }
  • 相关阅读:
    来自CSDN的精华网址
    图片及生成缩略图
    那位对DataGrid控熟悉?能否请教一下
    关于用.NET写邮件发送系统的问题
    JavaScript]几种常用的表单输入判断
    VB C# 语法对比图
    给上传的图片加上一个水印
    那位对DataGrid控熟悉?能否请教一下
    一句话木马的免杀(转)
    SOAP注入攻击详解(转)
  • 原文地址:https://www.cnblogs.com/invisible/p/2200117.html
Copyright © 2020-2023  润新知