二叉树的递归建立与输出 我编的程序老是不能正常输出
#include <iostream>
using namespace std;
class BiTreeNode
{
public:
char ch;
int frequency;
BiTreeNode * Lchild,* Rchild;
void Visit(BiTreeNode * T);
public:
void CreateBiTree(BiTreeNode * * T);
void PreOrderTraverse(BiTreeNode * T);
};
BiTreeNode * BiTreeHead=0;
int control=1;
void BiTreeNode::Visit(BiTreeNode * T)
{
cout<<T->ch;
}
void BiTreeNode::CreateBiTree(BiTreeNode * *T)
{
char ch;
if((ch=getchar())==' ')
T=0;
else
{
T=new BiTreeNode;
if(control==1)
BiTreeHead=T;
control++;
T->ch=ch;
CreateBiTree(*(T->Lchild));
CreateBiTree(*(T->Rchild));
}
}
void BiTreeNode::PreOrderTraverse(BiTreeNode * T)
{
if(T)
{
Visit(T);
PreOrderTraverse(T->Lchild);
PreOrderTraverse(T->Rchild);
}
}
int main()
{
cout<<"输入26个英文字母\n";
BiTreeNode * T=0;
T->CreateBiTree(* T);
T->PreOrderTraverse(BiTreeHead);
return 0;
}
希望以下代码能给你帮助
#include<iostream>
#include<iomanip>
#include<queue>
using namespace std;
class BinNode;//结点类
class BinTree;// 二叉树类
struct Info
{
int xIndent;
int yLevel;
};
template <typename T> T Max(T x,T y)
{
return (x>=y?x:y);
}
class BinNode
{
public:
BinNode():left(NULL),right(NULL){}
BinNode(int item,BinNode *lptr=NULL,BinNode *rptr=NULL)
:left(lptr),right(rptr),data(item){}
int getData()const{return data;}
BinNode *getLeft()const{return left;}
BinNode *getRight()const{return right;}
void setData(const int item){data=item;}
void setLeft(BinNode *lptr){left=lptr;}
void setRight(BinNode *rptr){right=rptr;}
private:
BinNode *left,*right;
int data;
};
class BinTree
{
public:
BinTree():root(NULL){}
BinTree(int item){root=new BinNode(item);}
virtual ~BinTree(){destroy(root);}
virtual int isEmpty(){return root==NULL?1:0;}
virtual BinNode *getLeftTree(BinNode *current)
{return root!=NULL?current->getLeft():NULL;}
virtual BinNode *getRightTree(BinNode *current)
{return root!=NULL?current->getRight():NULL;}
BinNode *getRoot()const{return root;}
void PreOrder();
void InOrder();
void PostOrder();
void LevelScan();
int Size(const BinNode *t)const;
int Height(const BinNode *t)const;
void PrintVTree();
friend ostream &operator <<(ostream &out,BinTree &Tree);
private:
void destroy(BinNode *current);
BinNode *root;
void Travers(BinNode *current,ostream &out)const;
void PreOrder(BinNode *current);// 前序遍历
void InOrder(BinNode *current);//中序遍历
void PostOrder(BinNode *current);//后序遍历
void LevelScan(BinNode *current);//层次遍历
void PrintVTree(BinNode *current);//树形打印
};
ostream &operator <<(ostream &out,BinTree &Tree)
{
out<<"Preorde traversal of binary tree.\n";
Tree.Travers(Tree.root,out);
out<<endl;
return out;
}
void BinTree::Travers(BinNode *current,ostream &out)const
{
if(current!=NULL)
{
out<<current->getData()<<' ';
Travers(current->getLeft(),out);
Travers(current->getRight(),out);
}
}
void BinTree::destroy(BinNode *current)
{
if(current!=NULL)
{
destroy(current->getLeft());
destroy(current->getRight());
delete current;
}
}
void BinTree::PreOrder()
{
PreOrder(root);
}
void BinTree::PreOrder(BinNode *current)
{
if(current!=NULL)
{
cout<<current->getData()<<' ';
PreOrder(current->getLeft());
PreOrder(current->getRight());
}
}
void BinTree::InOrder()
{
InOrder(root);
}
void BinTree::InOrder(BinNode *current)
{
if(current!=NULL)
{
InOrder(current->getLeft());
cout<<current->getData()<<' ';
InOrder(current->getRight());
}
}
void BinTree::PostOrder()
{
PostOrder(root);
}
void BinTree::PostOrder(BinNode *current)
{
if(current!=NULL)
{
PostOrder(current->getLeft());
PostOrder(current->getRight());
cout<<current->getData()<<' ';
}
}
int BinTree::Size(const BinNode *t)const
{
if(t==NULL)return 0;
else return 1+Size(t->getLeft())+Size(t->getRight());
}
int BinTree::Height(const BinNode *t)const
{
if(t==NULL)return -1;
else return 1+Max(Height(t->getLeft()),Height(t->getRight()));
}
void BinTree::LevelScan()
{
LevelScan(root);
}
void BinTree::LevelScan(BinNode *current)
{
queue<BinNode *> q;
BinNode *p;
if(current!=NULL)
{
q.push(current);
while(!q.empty())
{
p=q.front();
q.pop();
cout<<p->getData()<<' ';
if(p->getLeft()!=NULL)q.push(p->getLeft());
if(p->getRight()!=NULL)q.push(p->getRight());
}
}
}
void BinTree::PrintVTree()
{
PrintVTree(root);
}
void BinTree::PrintVTree(BinNode *current)
{
int hight=Height(current);
if(hight>=0)
{
queue<BinNode *> q;
queue<Info> qi;
Info s,s1,s2;
int level=-1;
BinNode *p;
long pow=1;
for(int i=0;i<hight;i++)
pow*=2;
pow=pow*2-1;
q.push(current);
s.xIndent=pow/2+1;
s.yLevel=0;
qi.push(s);
while(!q.empty()&&!qi.empty())
{
s2=s;
p=q.front();
q.pop();
s=qi.front();
qi.pop();
if(s.yLevel!=level)
{
level=s.yLevel;
cout<<endl;
cout<<setw(s.xIndent);
}
else
cout<<setw(s.xIndent-s2.xIndent);
cout<<p->getData();
if(p->getLeft()!=NULL)
{
q.push(p->getLeft());
s1.yLevel=s.yLevel+1;
s1.xIndent=s.xIndent-pow/(2*(s1.yLevel+1));
qi.push(s1);
}
if(p->getRight()!=NULL)
{
q.push(p->getRight());
s1.yLevel=s.yLevel+1;
s1.xIndent=s.xIndent+pow/(2*(s1.yLevel+1));
qi.push(s1);
}
}
}
else
cout<<"empty tree"<<endl;
cout<<endl;
}
int main()
{
BinTree x(0);
cout<<x<<endl;
BinNode *temp=new BinNode(1);
BinNode *pt=x.getRoot();
pt->setLeft(temp);
temp=new BinNode(2);
pt->setRight(temp);
pt=pt->getLeft();
pt->setLeft(new BinNode(3));
pt->setRight(new BinNode(4));
pt=pt->getLeft();
pt->setLeft(new BinNode(5));
pt->setRight(new BinNode(6));
pt=x.getRoot();
pt=pt->getRight();
pt->setRight(new BinNode(7));
pt=pt->getRight();
pt->setRight(new BinNode(8));
x.PrintVTree();
x.PostOrder();
cout<<endl;
x.InOrder();
cout<<endl;
x.PreOrder();
cout<<endl;
x.LevelScan();
cout<<endl;
}