题目:
以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。
输入格式:
输入二叉树的先序序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是,表示该二叉树是空树,否则该字符是相应结点的数据元素。
输出格式:
输出有两行:
第一行是原二叉树的中序遍历序列;
第二行是交换后的二叉树的中序遍历序列。
输入样例:
ABC##DE#G##F###
输出样例:
CBEGDFA
AFDGEBC
思路:用递归的想法写出前序创建和中序遍历两个函数,在用一个temp树中间量(类似与swap函数对两数进行交换,只不过在这里交换的是两颗二叉树的左右子树)交换完成后,再中序遍历这个二叉树即可。
代码:
#include<iostream>
using namespace std;
typedef int Status;
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode* lchild, *rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T){
TElemType ch;
cin>>ch;
if ('#' == ch) T = NULL;
else{
T = (BiTree)malloc(sizeof(BiTNode));
(T)->data = ch;
CreateBiTree((T)->lchild);
CreateBiTree((T)->rchild);
}
}
void ChangeTree(BiTree T)
{
BiTree temp=NULL;
if(T){
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
ChangeTree(T->lchild);
ChangeTree(T->rchild);
}
}
void InOrderTraverse(BiTree T){
if(T==NULL) return;
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
int main()
{
BiTree t;
CreateBiTree(t);
InOrderTraverse(t);
cout<<endl;
ChangeTree(t);
InOrderTraverse(t);
}