以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。
输入格式:
输入二叉树的先序序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。
输出格式:
输出有两行:
第一行是原二叉树的中序遍历序列;
第二行是交换后的二叉树的中序遍历序列。
输入样例:
ABC##DE#G##F###
输出样例:
CBEGDFA
AFDGEBC
核心思想:
(左右子树,其实也就是左右两个孩子)
(中序遍历:inorder traversal;前序遍历:preorder traversal;后序遍历:postroder traversal)
只要你知道二叉树中的左右子树怎么表示,交换的代码其实很简单,和最普通的两个int类型变量交换值一样的思想,先定义一个临时变量(只不过这里不是int类型了,而是指向树结点的指针类型),利用临时变量作中间值,即可完成交换。
参考代码:
#include<stdio.h>
#include<stdlib.h>
typedef char ElementType;
typedef struct TNode {
ElementType Data;
struct TNode* Left;
struct TNode* Right;
}TNode, * BinTree;
BinTree CreatBinTree() //创建二叉树
{
ElementType c;
BinTree T;
c = getchar();
if (c == '#')
{ // @ 是字符类型,得用单引号
return NULL;
}
else if (c == '\n') {
return NULL;
}
else {
T = (BinTree)malloc(sizeof(TNode));
T->Data = c;
T->Left = CreatBinTree();
T->Right = CreatBinTree();
}
return T;
}
void InorderTraversal(BinTree T) // 中序遍历
{
if (T)
{
InorderTraversal(T->Left);
printf("%c", T->Data);
InorderTraversal(T->Right);
}
}
void swap(BinTree T)
{ //交换左子树与右子树
if (!T->Left && !T->Right) // @ 如果没有左右子树
return;
BinTree tmp; // @ 原理就和两个变量 值互换 差不多
tmp = T->Left;
T->Left = T->Right;
T->Right = tmp;
if (T->Left)
swap(T->Left); // @ 继续递归,让子树的左右子树互换
if (T->Right)
swap(T->Right);
}
int main() {
BinTree T = CreatBinTree();
InorderTraversal(T);
printf("\n"); // @ 换行,加以区别
swap(T);
InorderTraversal(T);
}
温故而知新:
11.21
if (T) // @ 必须事先判断 T是否为空
{
InorderTraversal(T->Left);
printf("%c", T->Data);
InorderTraversal(T->Right);
}
if (T->Left) // @ 必须事先判断 T->Left 是否为空
swap(T->Left); // @ 继续递归,让子树的左右子树互换
if (T->Right)
swap(T->Right);
制作不易,如果对你有帮助的话,就点赞支持一下吧!