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

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

输入格式:

输入二叉树的先序序列。

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

输出格式:

输出有两行:

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

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

输入样例:

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

输出样例:

CBEGDFA

AFDGEBC

代码实现:

#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef struct TreeNode *BinTree;
struct TreeNode
{
    char data;
    BinTree left, right;
};

BinTree CreatBinTree();    //创建树 
void PreOrderTraversal( BinTree BT );    //中序遍历 
void change ( BinTree BT );    //交换根节点 

int main(){
    BinTree BT = CreatBinTree();
    PreOrderTraversal(BT);
    printf("
"); 
    change ( BT );
    PreOrderTraversal(BT);
    return 0;
}

BinTree CreatBinTree(){ //根据前序遍历创建树
    BinTree BT;
    char str;
    scanf("%c", &str);
    if (str != '#'){
        BT = (BinTree)malloc(sizeof(struct TreeNode));
        BT->data = str;
        BT->left = CreatBinTree();
        BT->right = CreatBinTree();
    }
    else {
        BT = NULL;
    }
    return BT;
}

void change ( BinTree BT ){    //交换根节点(左右子树不空) 
    if (BT->right == NULL && BT->left == NULL){
        return;
    }
    BinTree t;
    t = BT->left;
    BT->left = BT->right;
    BT->right = t;
    if (BT->left){    //往后扫描 
        change (BT->left);
    }
    if (BT->right){
        change (BT->right);
    }
}

void PreOrderTraversal( BinTree BT ){    //中序遍历 
    if (BT) {
        PreOrderTraversal (BT->left);
        printf("%c", BT->data);
        PreOrderTraversal (BT->right);
    }
}
原文地址:https://www.cnblogs.com/zhengxin909/p/12658809.html