zoukankan      html  css  js  c++  java
  • 二叉树的左右子树交换

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

    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;
    }
  • 相关阅读:
    我最讨厌画图,这辈子我都不想再画图
    bzoj1218[HNOI2003]激光炸弹
    bzoj1196[HNOI2006]公路修建问题
    bzoj1588[HNOI2002]营业额统计
    bzoj2039[2009国家集训队]employ人员雇佣
    bzoj3874[Ahoi2014]宅男计划
    bzoj2282[Sdoi2011]消防
    bzoj1798[Ahoi2009]Seq 维护序列seq
    bzoj4003[JLOI2015]城池攻占
    bzoj2809[Apio2012]dispatching
  • 原文地址:https://www.cnblogs.com/invisible/p/2200117.html
Copyright © 2011-2022 走看看