给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构,并输出该二叉树的先序遍历、中序遍历和后序遍历结果
本题目的代码框架参考如下
三种遍历的代码框架
Input
第一行输入一个整数t,表示有t个二叉树
第二行起输入每个二叉树的先序遍历结果,空树用字符‘0’表示,连续输入t行
Output
输出每个二叉树的先序遍历、中序遍历和后序遍历结果
Sample Input
2
AB0C00D00
AB00C00
Sample Output
ABCD
BCAD
CBDA
ABC
BAC
BCA
HINT
#include <iostream>
#include <stdlib.h>
using namespace std;
class BiTreeNode
{
private:
BiTreeNode *leftChild;
BiTreeNode *rightChild;
public:
char data;
BiTreeNode():leftChild(NULL), rightChild(NULL){}
BiTreeNode(char item, BiTreeNode *left = NULL,
BiTreeNode *right = NULL):
data(item), leftChild(left), rightChild(right){}
~BiTreeNode(){}
BiTreeNode * &Left(void)
{return leftChild;}
BiTreeNode * &Right(void)
{return rightChild;}
};
class BiTree
{
private:
BiTreeNode *root;
int i;
void Destroy(BiTreeNode * &t);
void PreOrder(BiTreeNode * &t);
void InOrder(BiTreeNode * &t);
void PostOrder(BiTreeNode * &t);
void CreateBiTree(BiTreeNode * &T,const char strTree[]);
public:
BiTree(void):root(NULL),i(0){};
~BiTree(void){};
void MakeTree(const char item, BiTree &left, BiTree &right);
void MakeTree(const char strTree[]);
void Destroy(void);
void PreOrder();
void InOrder();
void PostOrder();
};
void BiTree ::Destroy(void)
{
Destroy(root);
}
void BiTree ::Destroy(BiTreeNode * &t)
{
if(t != NULL && t->Left() != NULL)
Destroy(t->Left());
if(t != NULL && t->Right() != NULL)
Destroy(t->Right());
if(t != NULL)
{
// cout << t->data << " ";
delete t;
}
}
void BiTree::MakeTree(const char item, BiTree &left, BiTree &right)
{
root = new BiTreeNode(item, left.root, right.root);
}
void BiTree::MakeTree(const char strTree[])
{
i=0;
CreateBiTree(root,strTree);
}
void BiTree::CreateBiTree(BiTreeNode * &T, const char strTree[])
{
char ch;
ch=strTree[i++];
if (ch=='0') T = NULL;
else
{
T=new BiTreeNode();
T->data = ch;
CreateBiTree(T->Left(), strTree);
CreateBiTree(T->Right(), strTree);
}
}
void BiTree::PreOrder()
{
PreOrder(root);
}
void BiTree::PreOrder(BiTreeNode* &t)
{
if(t != NULL)
{
cout<<(t->data);
PreOrder(t->Left());
PreOrder(t->Right());
}
}
void BiTree::InOrder()
{
InOrder(root);
}
void BiTree:: InOrder(BiTreeNode* &t)
{
if(t != NULL)
{
InOrder(t->Left());
cout<<(t->data);
InOrder(t->Right());
}
}
void BiTree::PostOrder()
{
PostOrder(root);
}
void BiTree:: PostOrder(BiTreeNode* &t)
{
if(t != NULL)
{
PostOrder(t->Left());
PostOrder(t->Right());
cout<<(t->data);
}
}
/*int BiTree::LeafNum (BiTreeNode * &t)
{
if(!t->data)
return 0;
else if(!t->leftChild&&!t->rightChild)
return 1;
else
return LeafNum(t->leftChild)+LeafNum(t->rightChild);
}*/
int main(void)
{
int m,i;
char strTree[80];
BiTree myTree;
cin>>m;
cin.get();
for(i=0;i<m;i++)
{
cin>>strTree;
myTree.MakeTree(strTree);
myTree.PreOrder();
cout<<endl;
myTree.InOrder();
cout<<endl;
myTree.PostOrder();
cout<<endl;
myTree.Destroy();
}
return 0;
}
本题目的代码框架参考如下
三种遍历的代码框架
Input
第一行输入一个整数t,表示有t个二叉树
第二行起输入每个二叉树的先序遍历结果,空树用字符‘0’表示,连续输入t行
Output
输出每个二叉树的先序遍历、中序遍历和后序遍历结果
Sample Input
2
AB0C00D00
AB00C00
Sample Output
ABCD
BCAD
CBDA
ABC
BAC
BCA
HINT
#include <iostream>
#include <stdlib.h>
using namespace std;
class BiTreeNode
{
private:
BiTreeNode *leftChild;
BiTreeNode *rightChild;
public:
char data;
BiTreeNode():leftChild(NULL), rightChild(NULL){}
BiTreeNode(char item, BiTreeNode *left = NULL,
BiTreeNode *right = NULL):
data(item), leftChild(left), rightChild(right){}
~BiTreeNode(){}
BiTreeNode * &Left(void)
{return leftChild;}
BiTreeNode * &Right(void)
{return rightChild;}
};
class BiTree
{
private:
BiTreeNode *root;
int i;
void Destroy(BiTreeNode * &t);
void PreOrder(BiTreeNode * &t);
void InOrder(BiTreeNode * &t);
void PostOrder(BiTreeNode * &t);
void CreateBiTree(BiTreeNode * &T,const char strTree[]);
public:
BiTree(void):root(NULL),i(0){};
~BiTree(void){};
void MakeTree(const char item, BiTree &left, BiTree &right);
void MakeTree(const char strTree[]);
void Destroy(void);
void PreOrder();
void InOrder();
void PostOrder();
};
void BiTree ::Destroy(void)
{
Destroy(root);
}
void BiTree ::Destroy(BiTreeNode * &t)
{
if(t != NULL && t->Left() != NULL)
Destroy(t->Left());
if(t != NULL && t->Right() != NULL)
Destroy(t->Right());
if(t != NULL)
{
// cout << t->data << " ";
delete t;
}
}
void BiTree::MakeTree(const char item, BiTree &left, BiTree &right)
{
root = new BiTreeNode(item, left.root, right.root);
}
void BiTree::MakeTree(const char strTree[])
{
i=0;
CreateBiTree(root,strTree);
}
void BiTree::CreateBiTree(BiTreeNode * &T, const char strTree[])
{
char ch;
ch=strTree[i++];
if (ch=='0') T = NULL;
else
{
T=new BiTreeNode();
T->data = ch;
CreateBiTree(T->Left(), strTree);
CreateBiTree(T->Right(), strTree);
}
}
void BiTree::PreOrder()
{
PreOrder(root);
}
void BiTree::PreOrder(BiTreeNode* &t)
{
if(t != NULL)
{
cout<<(t->data);
PreOrder(t->Left());
PreOrder(t->Right());
}
}
void BiTree::InOrder()
{
InOrder(root);
}
void BiTree:: InOrder(BiTreeNode* &t)
{
if(t != NULL)
{
InOrder(t->Left());
cout<<(t->data);
InOrder(t->Right());
}
}
void BiTree::PostOrder()
{
PostOrder(root);
}
void BiTree:: PostOrder(BiTreeNode* &t)
{
if(t != NULL)
{
PostOrder(t->Left());
PostOrder(t->Right());
cout<<(t->data);
}
}
/*int BiTree::LeafNum (BiTreeNode * &t)
{
if(!t->data)
return 0;
else if(!t->leftChild&&!t->rightChild)
return 1;
else
return LeafNum(t->leftChild)+LeafNum(t->rightChild);
}*/
int main(void)
{
int m,i;
char strTree[80];
BiTree myTree;
cin>>m;
cin.get();
for(i=0;i<m;i++)
{
cin>>strTree;
myTree.MakeTree(strTree);
myTree.PreOrder();
cout<<endl;
myTree.InOrder();
cout<<endl;
myTree.PostOrder();
cout<<endl;
myTree.Destroy();
}
return 0;
}