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

Posted 郑NINE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交换二叉树中每个结点的左孩子和右孩子相关的知识,希望对你有一定的参考价值。

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

输入格式:

输入二叉树的先序序列。

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

输出格式:

输出有两行:

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

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

输入样例:

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("\n"); 
    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);
    }
}

 

以上是关于交换二叉树中每个结点的左孩子和右孩子的主要内容,如果未能解决你的问题,请参考以下文章

js二叉树算法

树2二叉树

二叉树层次遍历(包含C语言实现代码)

数据结构(C语言版) 树和二叉树 算法设计Demo3

二叉树 树 森林之间的转换

第六十三课 二叉树中的结点插入操作