#include <iostream>
using namespace std;
typedef struct BiNode
{
int data; //本次采用整数
struct BiNode* lchild, * rchild; //左孩子 右孩子
} BiNode, * BiTree;
//先序遍历
void Xianxu(BiTree T)
{
if (T) {
cout << T->data;
Xianxu(T->lchild);
Xianxu(T->rchild);
}
}
//中序遍历
void Zhongxu(BiTree T)
{
if (T) {
Zhongxu(T->lchild);
cout << T->data;
Zhongxu(T->rchild);
}
}
//后序遍历
void Houxu(BiTree T)
{
if (T) {
Houxu(T->lchild);
Houxu(T->rchild);
cout << T->data;
}
}
//创建二叉树
void CreateBiTree(BiTree& T) {
int ch;
cin >> ch;
if (ch == 0)//终止标志
T = NULL;
else {
T = new BiNode;
T->data = ch;//先序储存
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//交换节点
void swap( BiNode* &T1,BiNode* &T2 )
{
BiNode* temp;
temp = T1;
T1 = T2;
T2 = temp;
}
//交换每一个节点
void exchange(BiTree& T)
{
//要考虑到左右孩子为空的情况
if (T != NULL)//递归终止条件
{
if (T->lchild != NULL && T->rchild != NULL)
{
swap(T->lchild, T->rchild);
}
else if (T->lchild != NULL && T->rchild == NULL)
{
T->rchild = T->lchild;
T->lchild = NULL;
}
else if (T->lchild == NULL && T->rchild != NULL)
{
T->lchild = T->rchild;
T->rchild = NULL;
}
else if (T->lchild == NULL && T->rchild == NULL)
{
cout << "左右孩子均为空,不交换。" << endl;
}
exchange(T->lchild);
exchange(T->rchild);//先序交换
}
else
{
cout << "--------" << endl;
}
}
int main() {
BiTree T;//创建一颗二叉树
cout << "请输入根节点的值(以0为结束标志):";
CreateBiTree(T);
cout << "二叉树构建完毕!" << endl;
cout << "先序遍历输出: ";
Xianxu(T);
cout << endl;
cout << "中序遍历输出: ";
Zhongxu(T);
cout << endl;
cout << "后序遍历输出";
Houxu(T);
cout << endl;
cout << "三种遍历完毕!" << endl;
cout << "交换每个子节点" << endl;
exchange(T);
cout << "再次进行三种遍历!" << endl;
cout << "先序遍历输出: ";
Xianxu(T);
cout << endl;
cout << "中序遍历输出: ";
Zhongxu(T);
cout << endl;
cout << "后序遍历输出";
Houxu(T);
cout << endl;
cout << "遍历完毕!" << endl;
system("pause");
return 0;
}
实现思路:
- 首先定义出一个二叉树单元的结构,内部有 整形和左右孩子的指针。
- 二叉树的创建,同样是先序访问的思想,先将data赋值,然后递归调用左孩子右孩子,要设立递归终止条件(本题采用0为终止标志)。
- 先序中序后序的差别在于,访问的顺序,其中左右子树的顺序是一致的,访问在100,则先序,访问在010,则中序,访问在001,则后序。
- 交换的时候要注意左右子树是否为空的情况,并且用if-else语句来判断