交换二叉树中每个结点的左孩子和右孩子
以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。
输入格式:
输入二叉树的先序序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。
输出格式:
输出有两行:
第一行是原二叉树的中序遍历序列;
第二行是交换后的二叉树的中序遍历序列。
输入样例:
ABC##DE#G##F###
输出样例:
CBEGDFA
AFDGEBC
实现代码:
#include<bits/stdc++.h>
using namespace std;
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
//先序遍历创建树
void CreateBiTree(BiTree &T)
{
TElemType ch;
cin>>ch;
if(ch == '#')
T = NULL;
else
{
T = new BiTNode;
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//中序遍历输出树
void InOderTraverse(BiTree T)
{
if(T)
{
InOderTraverse(T->lchild);
cout << T->data;
InOderTraverse(T->rchild);
}
}
void DestroyBitree(BiTree& t)//销毁树
{
if(t)
{
DestroyBitree(t->lchild);
delete t;
DestroyBitree(t->rchild);
}
}
//交换结点的左右孩子
void exchange_child(BiTree &T)
{
BiTree t;
if(!T)
return ;
else
{
if(T->lchild && T->rchild)
{
t = T->rchild;
T->rchild = T->lchild;
T->lchild = t;
}
else if(T->lchild==NULL && T->rchild)
{
T->lchild = T->rchild;
T->rchild = NULL;
}
else if(T->rchild==NULL && T->lchild)
{
T->rchild = T->lchild;
T->lchild = NULL;
}
exchange_child(T->lchild);
exchange_child(T->rchild);
}
}
int main()
{
BiTree T;
CreateBiTree(T);
InOderTraverse(T);
cout << endl;
//printTree(T);
exchange_child(T);
InOderTraverse(T);
cout << endl;
//printTree(T);
DestroyBitree(T);
return 0;
}
结果:
打印输出树的函数:
void printTree(BiTNode *root, int deep = 1, string code=".")
{
/*
//*打印这颗二叉树
//* @root 树的根节点
//* @deep 此节点的深度
//* @code 从根节点遍历到此处的路径码,向左用0表示,向右用1表示*/
if (!root)
{
return;
}
printTree(root->rchild, deep+1, code+"1");
for (int i = 0; i < deep; ++i)
{
// printf(i==deep-1?"+---": (code[i]==code[i+1]?" ":"| "));
printf(i==deep-1?(code[i]=='1'?"┌────":"└────"): (code[i]==code[i+1]?" ":"│ "));
}
printf("(%c)\n", root->data);
printTree(root->lchild, deep+1, code+"0");
}
运行结果:
学长写的交换函数:
void exchange_child(BiTree &T)
{
if(T)
{
swap(T->lchild,T->rchild);
exchange_child(T->lchild);
exchange_child(T->rchild);
}
}
总结:
- 交换时分清楚交换的对象。
- swap(a,b)函数:交换a,b的值。