主题:[讨论]关于二叉树的遍历
#include <iostream>
using namespace std;
struct binode //定义结点类型
{
int data;
binode *lchild;
binode *rchild;
};
typedef binode *link; //结点类型指针用link代替
link point_node[101];
bool visited[101];
class bitree
{
public:
bitree(); //构造函数
bool empty() const; //判断是否为空
int number() const; //求二叉树的结点数
int high(link &tree_root) const; //求二叉树的高度
void cre_fr_arr(int count);
void preorder(int rootnum) const; //先序遍历
void inorder(int rootnum) const; //中序遍历
void postorder(int rootnum) const; //后序遍历
int searchRoot();
private:
int count; //记录二叉树中的结点数
};
bitree::bitree()
{
count=0;
for(int i=0;i<101;i++)
{
point_node[i]=new binode;
point_node[i]->data=0;
point_node[i]->rchild=NULL;
point_node[i]->lchild=NULL;
visited[i]=false;
}
}
int bitree::searchRoot()
{
int i=0;
for(i=0;i<count;i++)
if(visited[i]==false)
break;
return i+1;
}
bool bitree::empty() const
{
return count==0;
}
int bitree::number()const
{
return count;
}
int bitree::high(link &tree_root)const
{
if(tree_root==NULL)
return 0;
return (max(high(tree_root->lchild),high(tree_root->rchild))+1);
}
void bitree::cre_fr_arr(int countall)
{
static int j=0;
int a,b,c;
while(j<countall)
{
cin>>a>>b>>c;
count++;
point_node[a-1]->data=a;
if(b!=0)
{
point_node[a-1]->lchild=point_node[b-1];
visited[b-1]=true;
}
if(c!=0)
{
point_node[a-1]->rchild=point_node[c-1];
visited[c-1]=true;
}
j++;
}
}
void bitree::preorder(int rootnum) const
{
if(rootnum!=0)
{
cout<<point_node[rootnum-1]->data<<' ';
if(point_node[rootnum-1]->lchild!=NULL)
{preorder(point_node[rootnum-1]->lchild->data);}
if(point_node[rootnum-1]->rchild!=NULL)
{preorder(point_node[rootnum-1]->rchild->data);}
}
}
void bitree::inorder(int rootnum) const
{
if(rootnum!=0)
{
if(point_node[rootnum-1]->lchild!=NULL)
{inorder(point_node[rootnum-1]->lchild->data);}
cout<<point_node[rootnum-1]->data<<' ';
if(point_node[rootnum-1]->rchild!=NULL)
{inorder(point_node[rootnum-1]->rchild->data);}
}
}
void bitree::postorder(int rootnum) const
{
if(rootnum!=0)
{
if(point_node[rootnum-1]->lchild!=NULL)
{postorder(point_node[rootnum-1]->lchild->data);}
if(point_node[rootnum-1]->rchild!=NULL)
{postorder(point_node[rootnum-1]->rchild->data);}
cout<<point_node[rootnum-1]->data<<' ';
}
}
int main()
{
bitree bitree1=bitree();
int times;
int rootnum;
cin>>times;
bitree1.cre_fr_arr(times);
rootnum=bitree1.searchRoot();
cout<<"finish"<<endl;
cout<<rootnum<<endl;
cout<<"先序遍历结果:"<<endl;
bitree1.preorder(rootnum);
cout<<endl;
cout<<"中序遍历结果:"<<endl;
bitree1.inorder(rootnum);
cout<<endl;
cout<<"后序遍历结果:"<<endl;
bitree1.postorder(rootnum);
cout<<endl;
return 0;
}
代码中bitree1.cre_fr_arr(times); 不太懂!
还有要想输入字符要怎么样修改啊!
大家仔细看 呵呵 谢谢大家的帮助哦
!学习数据结构好难哦!
using namespace std;
struct binode //定义结点类型
{
int data;
binode *lchild;
binode *rchild;
};
typedef binode *link; //结点类型指针用link代替
link point_node[101];
bool visited[101];
class bitree
{
public:
bitree(); //构造函数
bool empty() const; //判断是否为空
int number() const; //求二叉树的结点数
int high(link &tree_root) const; //求二叉树的高度
void cre_fr_arr(int count);
void preorder(int rootnum) const; //先序遍历
void inorder(int rootnum) const; //中序遍历
void postorder(int rootnum) const; //后序遍历
int searchRoot();
private:
int count; //记录二叉树中的结点数
};
bitree::bitree()
{
count=0;
for(int i=0;i<101;i++)
{
point_node[i]=new binode;
point_node[i]->data=0;
point_node[i]->rchild=NULL;
point_node[i]->lchild=NULL;
visited[i]=false;
}
}
int bitree::searchRoot()
{
int i=0;
for(i=0;i<count;i++)
if(visited[i]==false)
break;
return i+1;
}
bool bitree::empty() const
{
return count==0;
}
int bitree::number()const
{
return count;
}
int bitree::high(link &tree_root)const
{
if(tree_root==NULL)
return 0;
return (max(high(tree_root->lchild),high(tree_root->rchild))+1);
}
void bitree::cre_fr_arr(int countall)
{
static int j=0;
int a,b,c;
while(j<countall)
{
cin>>a>>b>>c;
count++;
point_node[a-1]->data=a;
if(b!=0)
{
point_node[a-1]->lchild=point_node[b-1];
visited[b-1]=true;
}
if(c!=0)
{
point_node[a-1]->rchild=point_node[c-1];
visited[c-1]=true;
}
j++;
}
}
void bitree::preorder(int rootnum) const
{
if(rootnum!=0)
{
cout<<point_node[rootnum-1]->data<<' ';
if(point_node[rootnum-1]->lchild!=NULL)
{preorder(point_node[rootnum-1]->lchild->data);}
if(point_node[rootnum-1]->rchild!=NULL)
{preorder(point_node[rootnum-1]->rchild->data);}
}
}
void bitree::inorder(int rootnum) const
{
if(rootnum!=0)
{
if(point_node[rootnum-1]->lchild!=NULL)
{inorder(point_node[rootnum-1]->lchild->data);}
cout<<point_node[rootnum-1]->data<<' ';
if(point_node[rootnum-1]->rchild!=NULL)
{inorder(point_node[rootnum-1]->rchild->data);}
}
}
void bitree::postorder(int rootnum) const
{
if(rootnum!=0)
{
if(point_node[rootnum-1]->lchild!=NULL)
{postorder(point_node[rootnum-1]->lchild->data);}
if(point_node[rootnum-1]->rchild!=NULL)
{postorder(point_node[rootnum-1]->rchild->data);}
cout<<point_node[rootnum-1]->data<<' ';
}
}
int main()
{
bitree bitree1=bitree();
int times;
int rootnum;
cin>>times;
bitree1.cre_fr_arr(times);
rootnum=bitree1.searchRoot();
cout<<"finish"<<endl;
cout<<rootnum<<endl;
cout<<"先序遍历结果:"<<endl;
bitree1.preorder(rootnum);
cout<<endl;
cout<<"中序遍历结果:"<<endl;
bitree1.inorder(rootnum);
cout<<endl;
cout<<"后序遍历结果:"<<endl;
bitree1.postorder(rootnum);
cout<<endl;
return 0;
}
代码中bitree1.cre_fr_arr(times); 不太懂!
还有要想输入字符要怎么样修改啊!
大家仔细看 呵呵 谢谢大家的帮助哦
!学习数据结构好难哦!