交换二叉树每个结点的左孩子和右孩子
根据带虚结点的先序序列建立二叉树,再将二叉树中所有结点的左孩子和右孩子相互交换,然后按后序遍历输出各结点的值。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据在一行中输入一个字符串(不含空格且长度不超过80),表示二叉树的先序遍历序列,其中字符*表示虚结点(对应的子树为空)
。
输出格式:
对于每组测试,对所建立的二叉树将其中所有结点的左孩子和右孩子相互交换后,按后序遍历输出各结点的值。
输入样例:
HDA**C*B**GF*E***
-+a**xb**-c**d**/e**f**
输出样例:
EFGBCADH
fe/dc-bxa±
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
解题代码
#include<bits/stdc++.h>
using namespace std;
string str;
int len;
struct treeNode{
char data;
treeNode *L_child,*R_child;
treeNode(char d){
data=d;
}
};
template<class T>
class Tree{
public:
Tree(){
root=NULL;
}
treeNode* createNode()
{
treeNode *t;
if(len>=str.size()){
return NULL;
}
T data = str[len++];
if(data=='*'){
t=NULL;
}else{
t=new treeNode(data);
t->L_child=createNode();
t->R_child=createNode();
}
return t;
};
treeNode* getRoot();
void changeChild(treeNode *root);
void LRN(treeNode *root);
private:
treeNode *root;
};
template<class T>
treeNode* Tree<T>::getRoot()
{
return this->root;
}
template<class T>
void Tree<T>::changeChild(treeNode *root){
if(root==NULL) return;
treeNode *temp;
temp=root->L_child;
root->L_child=root->R_child;
root->R_child=temp;
changeChild(root->L_child);
changeChild(root->R_child);
}
template<class T>
void Tree<T>::LRN(treeNode *root){
if(root==NULL) return;
LRN(root->L_child);
LRN(root->R_child);
cout<<root->data;
}
int main()
{
while(cin>>str){
len=0;
Tree<char> *tree = new Tree<char>();
treeNode *root = tree->getRoot();
root = tree->createNode();
tree->changeChild(root);
tree->LRN(root);
cout<<endl;
}
}
解题思路
这里,我把结构体写类的外面,方便用,就是不能用T模板,会报错,我也不知道为啥,然后把,这里改变的话也是递归下去,然后每个结点都要进行左右孩子交换,交换完了再后序遍历就可以了,还是简单的;