数据结构二叉树
#include <iostream>
#include <cstdlib>
#include <stack>
using namespace std;
/********************************
已知二叉树的逻辑结构如下:
A
/ \
B D
\
C
请完成:
1根据先缀串建立二叉树
2输出先序、中序和后序遍历的结果
3输出叶子节点的数量
4输出二叉树的深度
5输出非递归中序遍历的结果
输入用例:AB#C##D##
输出用例:
ABCD
BCAD
CBDA
2
3
BCAD
用例说明:
1输入用例中'#'表示空树
2输出用例的前三行分别代表三种遍历的结果
3输出用例的第四行表示叶子节点的数量
4输出用例的第五行表示树的深度
5输出用例的第六行表示非递归中序遍历结果
注意:建议在本用例基础上再自行设计1个复杂一点的用例作为测试
*********************************/
typedef struct BiTNode//二叉树结点结构
{
string data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
void CreateBiTree(BiTree &T)//根据先缀串建树
{
/**请完善该函数**/
char ch;
cin>>ch;
if(ch=='#') T=NULL;
else {
if(T=new BiTNode){
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
else{
cout<<"Overflow"<<endl;
}
}
}
void PreOrderTraver(BiTree T)//先序遍历
{
/**请完善该函数**/
if(T){
cout<<T->data;
PreOrderTraver(T->lchild);
PreOrderTraver(T->rchild);
}
}
void InOrderTraver(BiTree T)//中序遍历
{
/**请完善该函数**/
if(T){
InOrderTraver(T->lchild);
cout<<T->data;
InOrderTraver(T->rchild);
}
}
void PostOrderTraver(BiTree T)//后序遍历
{
/**请完善该函数**/
if(T){
PostOrderTraver(T->lchild);
PostOrderTraver(T->rchild);
cout<<T->data;
}
}
void CountLeaf(BiTree T,int &c)//计算叶子节点数量
{
/**请完善该函数**/
if(T){
if(!(T->lchild) && !(T->rchild)){
c++;
}
else{
CountLeaf(T->lchild,c);
CountLeaf(T->rchild,c);
}
}
}
int Depth(BiTree T) //计算二叉树的深度
{
/**请完善该函数**/
if(!T) return 0;
else{
return (Depth(T->lchild)>Depth(T->rchild) ? Depth(T->lchild) : Depth(T->rchild))+1;
}
}
BiTNode *GoFarLeft(BiTree T,stack<BiTNode *> &S) //找T的最左下结点
{
if(!T) return NULL;
while(T->lchild)
{
S.push(T);
T=T->lchild;
}
return T;
}
void Inorder_I(BiTree T)
{
/**请完善该函数,需要用到的GoFarLeft函数上面已经定义完毕**/
stack<BiTree> S;
T=GoFarLeft(T,S);
while(T){
cout<<T->data;
if(T->rchild){
T=GoFarLeft(T->rchild,S);
}else if(!S.empty()){
T=S.top();
S.pop();
}else{
T=NULL;
}
}
}
int main()
{
BiTree T;
CreateBiTree(T);//建树
PreOrderTraver(T);//先序遍历
cout<<endl;
InOrderTraver(T);//中序遍历
cout<<endl;
PostOrderTraver(T);//后序遍历
cout<<endl;
int c=0;//叶子数量
CountLeaf(T,c);//计算叶子数量
cout<<c;
cout<<endl;
cout<<Depth(T);//计算深度并输出
cout<<endl;
Inorder_I(T);//中序的非递归遍历
return 0;
}