关键思想:将大问题转换为小问题,先从树梢开始交换即树的叶子到树根。
关键代码:
void changeTree(BiTree& T)//交换左右子树
{
if (T)
{
if (T->lchild || T->rchild)//判断该结点是否存在左右子树
{
changeTree(T->lchild);//先转换左子树的左右子树
changeTree(T->rchild);//再转换右子树的左右子树
BiTree temp;//最后转换自己的左右子树
temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
}
}
}
代码实现:
头文件
#pragma once
#include<iostream>
#define OK 1;
#define ERROR 0;
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
int creatTree(BiTree& T);//初始化二叉树
void changeTree(BiTree& T);//交换左右子树
void disTree(BiTree T);//先序法展现树的结果
函数定义
#include"标头.h"
using namespace std;
int creatTree(BiTree& T)
{
char m;
scanf_s("%c", &m);
if (m == ' ')//若输入的为空格,则表示该结点为空
{
T = NULL;
return 0;
}
else
{
T = (BiTree)malloc(sizeof(BiTNode));//输出不为空格,这初始话该结点
if (T)
{
T->data = m;
creatTree(T->lchild);//再初始化左孩子
creatTree(T->rchild);//再初始化右孩子
}
return OK;
};
}
void changeTree(BiTree& T)//交换左右子树
{
if (T)
{
if (T->lchild || T->rchild)//判断该结点是否存在左右子树
{
changeTree(T->lchild);//先转换左子树的左右子树
changeTree(T->rchild);//再转换右子树的左右子树
BiTree temp;//最后转换自己的左右子树
temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
}
}
}
void disTree(BiTree T)//先序法展现树的结果
{
if (T)
{
cout << T->data << endl;
disTree(T->lchild);
disTree(T->rchild);
}
}
主函数调用
#include"标头.h"
int main()
{
BiTree T;
creatTree(T);
changeTree(T);
disTree(T);
return 0;
}