PTA 7-6 交换二叉树中每个结点的左孩子和右孩子 (20 分)
以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。
#include <iostream>
#include <cstdio>
using namespace std;
template<typename T>
struct TreeNode
{
T data;
TreeNode<T> *lchild;
TreeNode<T> *rchild;
TreeNode()
{
data=0;
lchild=NULL;
rchild=NULL;
}
TreeNode(T n)
{
data=n;
lchild=NULL;
rchild=NULL;
}
};
template<typename T>
void InOrder(TreeNode<T> *subtree,void(*visit)(TreeNode<T> *p))
{
if(subtree!=NULL)
{
InOrder(subtree->lchild,visit);
visit(subtree);
InOrder(subtree->rchild,visit);
}
}
template<typename T>
TreeNode<T> * Reverse(TreeNode<T> *subtree)
{
if(subtree==NULL)
{
return NULL;
}
else
{
Reverse(subtree->lchild);
Reverse(subtree->rchild);
}
TreeNode<T> *t=subtree->lchild;
subtree->lchild=subtree->rchild;
subtree->rchild=t;
return subtree;
}
template<typename T>
void visit(TreeNode<T> *p)
{
cout<<p->data;
}
template<typename T>
void Create(TreeNode<T> *&subtree)//没有返回值的函数若要保留节点信息,应该加上“&”符号!
{
char ch;
scanf("%c",&ch);
if(ch!='\n')
{
if(ch=='#')
{
subtree=NULL;
}
else
{
subtree=new TreeNode<T>(ch);
Create(subtree->lchild);
Create(subtree->rchild);
}
}
}
int main()
{
TreeNode<char> *p=new TreeNode<char>;
Create(p);
InOrder(p,visit);
cout<<endl;
Reverse(p);
InOrder(p,visit);
cout<<endl;
return 0;
}