第五章算法设计题3
题目描述
交换二叉树每个结点的左孩子和右孩子
代码实现
#pragma once
#include <iostream>
using namespace std;
typedef char ElemType;
typedef struct BiTnode
{
ElemType data;
struct BiTnode* lchild;
struct BiTnode* rchild;
}BiTnode,*BiTree;
//初始化 构造空二叉树
void InitBiTree(BiTree& T)
{
T = NULL;
}
//构造二叉树
//按先序次序输入二叉树中结点的值(一个字符)
//#字符表示空树,结束输入
void createBiTree(BiTree& T)
{
char data;
cin >> data;
if (data != '#')
{
//生成根节点
T = new BiTnode;
T->data = data;
// 递归构造左子树
createBiTree(T->lchild);
// 递归构造左子树
createBiTree(T->rchild);
}
else
{
T = NULL;
}
}
//先序递归遍历二叉树(根左右)
void PreOrder(BiTree T)
{
if (T != NULL)
{
// 访问根结点
cout << T->data << " ";
// 遍历左子树
PreOrder(T->lchild);
// 遍历右子树
PreOrder(T->rchild);
}
}
void ChangeLR(BiTree& T)
{
if (T->lchild == NULL && T->rchild == NULL)
{
return;
}
else
{
BiTree temp=T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
}
// 递归交换左子树
ChangeLR(T->lchild);
//递归交换右子树
ChangeLR(T->rchild);
}
int main()
{
BiTree T;
InitBiTree(T);
cout << "按先序次序输入二叉树中结点的值" << endl;
createBiTree(T);
//先序遍历
cout << "先序遍历:" << endl;
PreOrder(T);
cout << endl;
//交换之后先序遍历
cout << "先序遍历:" << endl;
ChangeLR(T);
PreOrder(T);
cout << endl;
system("pause");
return 0;
}