1105: 交换二叉树的孩子结点
题目描述
编程程序实现将二叉树中所有结点的左右孩子互换。
输入
二叉树的先序序列(输入先序序列建立二叉树)。
输出
第一行为交换后的二叉树的中序序列
第二行为交换后的二叉树的先序序列
样例输入
ABD###C###
样例输出
CABD
ACBD
思路:
- 题干要求交换孩子结点,那么我们不妨将左孩子结点视为右孩子结点输出,右孩子结点视为左孩子结点输出,简单来说就是把左右孩子对调输出即可求解。
- 了解前中后三种遍历二叉树的顺序:
- 先序遍历:根–>左–>右 ABGDECFH
- 中序遍历:左–>根–>右 GBEDAFCH
- 后序遍历:左–>右–>根 GEDBFHCA
(注:前序也称为先序)
代码实现:
typedef struct Tree
{
char data;
struct Tree *lchild, *rchild;
}Tree;
//先序遍历
void pre(Tree *&t)
{
if(t!=NULL)
{
printf("%c", t->data);//等价于 cout << t->data;
pre(t->lchild);
pre(t->rchild);
}
}
//中序遍历
void mid(Tree *&t)
{
if(t!=NULL)
{
mid(t->lchild);
printf("%c", t->data);//等价于 cout << t->data;
mid(t->rchild);
}
}
//后序遍历
void fin(Tree *&t)
{
if(t!=NULL)
{
fin(t->lchild);
fin(t->rchild);
printf("%c", t->data);//等价于 cout << t->data;
}
}
#include<bits/stdc++.h>
using namespace std;
typedef struct tree
{
char data;
struct tree *lchild, *rchild;
}tree;
void creat(tree *&t)
{
char ch;
cin >> ch;//类似于scanf("%c", &ch);
if(ch=='#')
{
t=NULL;
}
else
{
t=new tree();
//类似于t=(tree *)malloc(sizeof(tree));
t->data=ch;
creat(t->lchild);
creat(t->rchild);
}
}
void mid(tree *&t)
{
if(t!=NULL)//递归终止条件
{
mid(t->rchild);
cout << t->data;//类似于printf("%c", t->data);
mid(t->lchild);
}
}
void pre(tree *&t)
{
if(t!=NULL)//递归终止条件
{
cout << t->data;//类似于printf("%c", t->data);
pre(t->rchild);
pre(t->lchild);
}
}
int main()
{
tree *t;
creat(t);
mid(t);
cout << "\n";//类似于printf("\n");
pre(t);
return 0;
}
以上方法仅供参考,欢迎互联网的广大朋友们提出指正。