二叉树的递归建立与输出 我编的程序老是不能正常输出


#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;
}
[1212 byte] By [bingbinggongzi260] at [2008-4-24]
# 1
将void CreateBiTree(BiTreeNode * * T);改为void CreateBiTree(BiTreeNode * T);程序可执行,但是你的程序缺递归结束条件。所以程序将无限执行下去。
别外编程风格不太好,应将结点类与树类分开较好,以便于测试和维护。
kingbo2006-韫知 at 2007-10-19 > top of Msdn China Tech,专题开发,技术,项目,数据结构,算法...
# 2
具体修改如下:
#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);
};
class binTree
{
};

BiTreeNode * BiTreeHead=0;
int control=1;

void BiTreeNode::Visit(BiTreeNode * T)
{
cout<<T->ch;
}

void BiTreeNode::CreateBiTree(BiTreeNode *T)//已修改
{
char ch;

cin>>ch;
if(ch==' ')
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;
}

kingbo2006-韫知 at 2007-10-19 > top of Msdn China Tech,专题开发,技术,项目,数据结构,算法...
# 3
虽然编译可以通过 ,但还是不能输出正确结果
你提的建议还是听好的 但到底应该怎样构造类啊?
能不能帮我构造个类啊?
bingbinggongzi260 at 2007-10-19 > top of Msdn China Tech,专题开发,技术,项目,数据结构,算法...
# 4
希望以下代码能给你帮助
#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;

}
kingbo2006-韫知 at 2007-10-19 > top of Msdn China Tech,专题开发,技术,项目,数据结构,算法...