附:
1.控制遍历时的输出格式:
设置全局变量 bool sign;
调用遍历函数前,令sign等于true;
遍历函数内设置语句:
if(sign)sign=false;
else cout<<',';
cout<<T->data;
2.RE的一个原因:返回值为bool或其它非void的函数体内未设置return语句;
输入说明:
第一行:表示无孩子或指针为空的特殊分隔符
第二行:二叉树的先序序列(结点元素之间以空格分隔)
输出说明:
第一行:二叉树先序遍历结果
第二行:二叉树中序遍历结果
第三行:二叉树后序遍历结果
输入范例:
null
A B null C D null null E null null F null G null H null null
输出范例:
A,B,C,D,E,F,G,H
B,D,C,E,A,F,G,H
D,E,C,B,H,G,F,A
代码:
#include<iostream>
#include <sstream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<vector>
#include <climits>
#define MAX_SIZE 100
using namespace std;
bool sign;
//结点
template<class ElemType>
struct BinaryTreeNode
{
ElemType data;
BinaryTreeNode<ElemType> *LChild, *RChild;
BinaryTreeNode() : LChild(NULL), RChild(NULL){}
BinaryTreeNode(const ElemType &item, BinaryTreeNode<ElemType> *Lptr = NULL, BinaryTreeNode<ElemType> *Rptr = NULL)
{
LChild = Lptr;
RChild = Rptr;
data = item;
}
};
//二叉树
template<class ElemType>
class BinaryTree
{
private:
BinaryTreeNode<ElemType> *root;
public:
BinaryTree():root(NULL){}
BinaryTree(const ElemType &item){root = new BinaryTreeNode<ElemType>(item);}
void makeBinaryTree( const ElemType &item, BinaryTree &left, BinaryTree &right);
//返回二叉树结点的个数int BinaryTreeSize( BinaryTreeNode<ElemType> *T ) const;
//判断二叉树是否为空
bool BinaryTreeisEmpty() const{return root == NULL;}
//获取根结点元素值
ElemType GetRootData() const{ return root->data;}
void SetRoot(BinaryTreeNode<ElemType> * p){ root = p;}
BinaryTreeNode<ElemType> * GetRoot() const{ return root;}
bool PreOrderTraverse( BinaryTreeNode<ElemType> *T ); //前序遍历(递归)//num的初始值为0,作用为控制输出格式(最后1个结点后不加“,”)
bool InOrderTraverse( BinaryTreeNode<ElemType> *T ); //中序遍历(递归)
bool PostOrderTraverse( BinaryTreeNode<ElemType> *T ); //后序遍历(递归)
BinaryTreeNode<ElemType>* CreateBinaryTree(vector<ElemType> &x, ElemType &empty, int &n);
};
template<class ElemType>
bool BinaryTree<ElemType>::PreOrderTraverse( BinaryTreeNode<ElemType> *T )
{
if(T)
{
if(sign)sign=false;
else cout<<',';
cout<<T->data;
PreOrderTraverse(T->LChild);
PreOrderTraverse(T->RChild);
return true;
}
return false;
}
template<class ElemType>
bool BinaryTree<ElemType>::InOrderTraverse( BinaryTreeNode<ElemType> *T )
{
if(T)
{
InOrderTraverse(T->LChild);
if(sign)sign=false;
else cout<<',';
cout<<T->data;
InOrderTraverse(T->RChild);
return true;
}
return false;
}
template<class ElemType>
bool BinaryTree<ElemType>::PostOrderTraverse( BinaryTreeNode<ElemType> *T )
{
if(T)
{
PostOrderTraverse(T->LChild);
PostOrderTraverse(T->RChild);
if(sign)sign=false;
else cout<<',';
cout<<T->data;
return true;
}
return false;
}
template<class ElemType>
BinaryTreeNode<ElemType>* BinaryTree<ElemType>::CreateBinaryTree(vector<ElemType> &x, ElemType &empty, int &n)
{
ElemType ch = x[n];//string
n++;
if (ch == empty)
{
return NULL;
}
else
{
BinaryTreeNode<ElemType> *Node = new BinaryTreeNode<ElemType>;
Node->data = ch;
Node->LChild = CreateBinaryTree(x, empty, n);
Node->RChild = CreateBinaryTree(x, empty, n);
return Node;
}
}
template<class ElemType>
void CreateTree(BinaryTree<ElemType> &T, ElemType &str, ElemType &empty)
{
ElemType tmp;
vector<ElemType> t;
stringstream input_T(str);
while(input_T >> tmp)
{
t.push_back(tmp);
}
BinaryTreeNode<ElemType> *root;
int num = 0;
root = T.CreateBinaryTree(t, empty, num);
T.SetRoot(root);
}
int main()
{
BinaryTree<string> T;
string str;
string empty;
getline(cin,empty);
getline(cin,str);
CreateTree(T,str,empty);
sign=true;
T.PreOrderTraverse(T.GetRoot());cout<<endl;
sign=true;
T.InOrderTraverse(T.GetRoot());cout<<endl;
sign=true;
T.PostOrderTraverse(T.GetRoot());cout<<endl;
return 0;
}