二叉树的创建
不同的输入方式有不同的创建方式,这里给根据两种不同的二叉树输入方式编写出两种不同的创建代码。
- 第一种:根据二叉树的先序遍历创建二叉树
//样例输入,'#'表示结束
//ABC##DE#G##F###
char node[400][400];
//结点的定义
typedef struct BinTNode{
char data;//数据域
struct BinTNode *lchild;
struct BinTNode *rchild;
int depth;
int flag;
}BinTNode,*BinTree;
void BuildTree(BinTree &tree)//按先序遍历创建二叉树
{
char ch;
cin>>ch;
if(ch=='#')
tree=NULL;
else{
tree=new BinTNode;
tree->data=ch;
tree->depth=1;
BuildTree(tree->lchild);
BuildTree(tree->rchild);
}
}
- 第二种:
//样例输入,()表示输入结束
//(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
char s[N];
struct node{
bool have_value;
int v;
node *lchild,*rchild;
node():have_value(false),lchild(NULL),rchild(NULL){}
};
//根节点
node *root;
bool failed;
void addnode(int v,char *s)
{
int n=strlen(s);
node *u=root;
for(int i=0;i<n;i++){
if(s[i]=='L'){
if(u->lchild==NULL) {
u->lchild=new node();
}
u=u->lchild;
}else if(s[i]=='R'){
if(u->rchild==NULL){
u->rchild=new node();
}
u=u->rchild;
}else{
if(u->have_value) failed=true; //已经赋值了
u->v=v;
u->have_value=true;
}
}
}
//输入
bool read_input()
{
failed=true;
remove_tree(root);
root=new node();
for(;;){
if(scanf("%s",s)!=1) return false;
if(strcmp(s,"()")==0) break;
cout<<s<<endl;
int v; //读入节点的值
sscanf(&s[1],"%d",&v);
addnode(v,strchr(s,',')+1); //查找逗号出现的位置,“LLL)"
if(failed) cout<<"-1\n";
}
return true;
}
二叉树的遍历
层次遍历需要借助队列queue,而前序,中序,后序遍历只需要改变根节点输出的位置即可。
- 层次遍历
//层次遍历
//根据第二种输入方式
bool bfs(vector<int>& ans)
{
queue<node *>q;
q.push(root);
ans.clear();
while(!q.empty()){
node *u=q.front();
q.pop();
if(u->have_value==false) return false;//节点没有赋值,输入错误
ans.push_back(u->v);
if(u->lchild) q.push(u->lchild);
if(u->rchild) q.push(u->rchild);
}
return true;
}
- 先序遍历
void PreOrder(BinTree tree)
{
if(tree)
{
cout<<tree->data<<'\t';
PreOrder(tree->lchild);
PreOrder(tree->rchild);
}
}
- 中序遍历
void InOrder(BinTree tree)
{
if(tree)
{
InOrder(tree->lchild);
cout<<tree->data<<'\t';
InOrder(tree->rchild);
}
}
- 后序遍历
void PosOrder(BinTree tree)
{
if(tree)
{
PosOrder(tree->lchild);
PosOrder(tree->rchild);
cout<<tree->data<<'\t';
}
}
二叉树形状的绘制
这是数据结构课程实验老师提出的拓展问题,当时也是想了好久,最后一下子突然就想通了,然后就写出来了。
//根据第一种输入的数据结构
void PaintTree(BinTree T,int depth,int r,int l)//r为开始的行,l为列
{
if(T==NULL)return;
int m=(1<<(depth-1));
node[r][l]=T->data;
if(T->lchild)
{
for(int i=1;i<=m;i++)
node[r+i][l-i]='/';
PaintTree(T->lchild,depth-1,r+m+1,l-m-1);
}
if(T->rchild)
{
for(int i=1;i<=m;i++)
node[r+i][l+i]='\\';
PaintTree(T->rchild,depth-1,r+m+1,l+m+1);
}
}
最后,上图!!!
如有错误,欢迎大家指正!!