本程序建树方法采用“先序遍历+空树用0表示”
结点和树的构建
class Node
{
public:
char data;
Node *left,*right;
Node()
{
left=right=NULL;
}
};
class Tree
{
private:
Node *Root;
public:
Tree(){Root=Create();}
Node* Create();//树的创建(前序遍历方法
void visit(Node *p)
{ //访问P结点的数据
cout<<p->data;
}
void PreOrder(Node *node);//前序遍历输出
void InOrder(Node *node);//中序遍历输出
void PostOrder(Node *node);//后序遍历输出
void LevelOrder(Node* node);//层次遍历输出
int GetHeight(Node*node);//获得树的高度
Node* GetRoot()
{
return Root;
}
~Tree(){
}
};
创建树(前序遍历方法)
Node *Create()
{
Node *p;
char ch;
ch=x[now++];
if(ch=='0')
p=NULL;
else
{
p=new Node();
p->data=ch;
p->left=Create();//先前序遍历左子树
p->right=Create();//前序遍历右子树
}
return p;
}
前序遍历:
void PreOrder(Node *node)
{
if(node!=NULL)
{
visit(node);//输出结点的信息
PreOrder(node->left);
PreOrder(node->right);
}
}
中序遍历:
void InOrder(Node *node)
{
if(node!=NULL)
{
InOrder(node->left); //中序遍历左子树
visit(node);
InOrder(node->right);//中序遍历右子树
}
}
后序遍历:
void PostOrder(Node *node)
{
if(node!=NULL)
{
PostOrder(node->left); //后序遍历左子树
PostOrder(node->right); //后序遍历右子树
visit(node);
}
}
层次遍历
void LevelOrder(Node *node)
{
queue<Node *> Queue;//用队列输出
Node *p;
if(node!=NULL)
Queue.push(node);
while(!Queue.empty())
{
p=Queue.front();
visit(p);
Queue.pop();
if(p->left!=NULL)//把p的左孩子放进队列
Queue.push(p->left);
if(p->right!=NULL)//把p的右孩子放进队列
Queue.push(p->right);
}
}
获得树的高度:
int Tree::GetHeight(Node* node)
{
if(node==NULL)
return 0;
int size1=GetHeight(node->left);
int size2=GetHeight(node->right);
if(size1>size2)
return (++size1);
else
return (++size2);
}
总代码:
#include<bits/stdc++.h>
using namespace std;
string x; //
int now=0; //
class Node
{
public:
char data;
Node *left,*right;
Node()
{
left=right=NULL;
}
};
class Tree
{
private:
Node *Root;
public:
Tree(){Root=Create();}
Node* Create();//树的创建(前序遍历方法
void visit(Node *p)
{ //访问P结点的数据
cout<<p->data;
}
void PreOrder(Node *node);//前序遍历输出
void InOrder(Node *node);//中序遍历输出
void PostOrder(Node *node);//后序遍历输出
void LevelOrder(Node* node);//层次遍历输出
Node* GetRoot()
{
return Root;
}
int GetHeight(Node*node);//获得树的高度
~Tree(){
}
};
Node* Tree::Create()
{
Node *p;
char ch;
ch=x[now++];
if(ch=='0')
p=NULL;
else
{
p=new Node();
p->data=ch;
p->left=Create();//先前序遍历左子树
p->right=Create();//前序遍历右子树
}
return p;
}
void Tree::PreOrder(Node *node)
{
if(node!=NULL)
{
visit(node);//输出结点的信息
PreOrder(node->left);
PreOrder(node->right);
}
}
void Tree::InOrder(Node *node)
{
if(node!=NULL)
{
InOrder(node->left); //中序遍历左子树
visit(node);
InOrder(node->right);//中序遍历右子树
}
}
void Tree::PostOrder(Node *node)
{
if(node!=NULL)
{
PostOrder(node->left); //后序遍历左子树
PostOrder(node->right); //后序遍历右子树
visit(node);
}
}
void Tree::LevelOrder(Node *node)
{
queue<Node *> Queue;//用队列输出
Node *p;
if(node!=NULL)
Queue.push(node);
while(!Queue.empty())
{
p=Queue.front();
visit(p);
Queue.pop();
if(p->left!=NULL)//把p的左孩子放进队列
Queue.push(p->left);
if(p->right!=NULL)//把p的右孩子放进队列
Queue.push(p->right);
}
}
int Tree::GetHeight(Node* node)
{
if(node==NULL)
return 0;
int size1=GetHeight(node->left);
int size2=GetHeight(node->right);
if(size1>size2)
return (++size1);
else
return (++size2);
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>x;
now=0;
Tree tree;
cout<<"Pre--"<<endl;
tree.PreOrder(tree.GetRoot());
cout<<endl;
cout<<"In--"<<endl;
tree.InOrder(tree.GetRoot());
cout<<endl;
cout<<"Post--"<<endl;
tree.PostOrder(tree.GetRoot());
cout<<endl;
cout<<"Level--"<<endl;
tree.LevelOrder(tree.GetRoot());
cout<<endl;
cout<<"height--" <<endl;
cout<<tree.GetHeight(tree.GetRoot())<<endl;
cout<<endl;
}
}
数据输入:
扫描二维码关注公众号,回复:
3659216 查看本文章
2
AB0C00D00
ABCD00E000FG00H0I00
这两棵树的图像:
输出: