题目描述:
以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。
输入格式:
输入二叉树的先序序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。
输出格式:
输出有两行:
第一行是原二叉树的中序遍历序列;
第二行是交换后的二叉树的中序遍历序列。
输入样例:
ABC##DE#G##F###
输出样例:
CBEGDFA
AFDGEBC
解析:
二叉树结构定义:
struct node{
char data;
node *lchild,*rchild;
};
建立二叉树的递归函数,注意形参表列的取地址符:
void SetBiTree(node* &t){
char c;
cin>>c;
if(c=='#'){
t = NULL;
}
else{
t = new node;
t->data = c;
SetBiTree(t->lchild);
SetBiTree(t->rchild);
}
}
中序遍历:
void Traverse(node *t){
if(t == NULL) return;
Traverse(t->lchild);
cout<<t->data;
Traverse(t->rchild);
}
交换二叉树每一个结点的左右孩子:
同样也是使用了递归的思想,倘若左右孩子均为空,则不做处理,否则进行交换,并分别进入左孩子结点与右孩子结点。
此处的交换用到了C++自带的swap交换工具,需要iostream头文件与std名称空间。
void change(node* &t){
if( t->lchild == NULL && t->rchild == NULL ){
return;
}
swap(t->lchild,t->rchild);
if(t->lchild){
change(t->lchild);
}
if(t->rchild){
change(t->rchild);
}
}
主函数:
int main()
{
node *root;
SetBiTree(root);
Traverse(root);
cout<<endl;
change(root);
Traverse(root);
return 0;
}
成功AC
这篇学习笔记介绍了一个二叉树问题,即如何交换二叉树中每个节点的左孩子和右孩子。通过输入二叉树的先序序列,程序会输出交换前后的中序遍历序列。解析部分提到了利用递归实现二叉树的建立、中序遍历以及交换节点操作,主要使用C++的swap函数完成节点交换。
1万+

被折叠的 条评论
为什么被折叠?



