题目大意:给出一系列字串,最后一个是树根,建立一颗二叉排序树,先序输出二叉排序结果。
方法一:数组存储二叉树
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct node {
int lc, rc;
char data;
}tree[100];
char str[100];
int num;
void insert(int p,char data) //插入节点
{
if(tree[p].data==0){
tree[p].data=data;
return ;
}
else
if(tree[p].data<data){
if(!tree[p].rc) tree[p].rc=++num;
insert(tree[p].rc,data);
}
else {
if(!tree[p].lc) tree[p].lc=++num;
insert(tree[p].lc,data);
}
}
void dlr(int p) //先根遍历
{
if(tree[p].data==0) return;
printf("%c",tree[p].data);
if(tree[p].lc)
dlr(tree[p].lc);
if(tree[p].rc)
dlr(tree[p].rc);
}
int main()
{
while(scanf("%s",str)>0){
int len=strlen(str);
char ch;
num=1; //数组序号,模拟指针
memset(tree,0,sizeof(tree));
for(; ;) {
scanf("%c",&ch);
if(ch>='A'&&ch<='Z')
str[len++]=ch;
else
if(ch=='*'||ch=='$') break;
}
for(int i=len-1;i>=0;i--)
insert(1,str[i]);
dlr(1);
printf("\n");
if(ch=='$') break;
}
return 0;
}
方法二,指针
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct node {
char data;
node *lc,*rc;
}*tree;
char str[100];
void insert(node * &p,char data) { //注意这里参数的传递,tree是树的根节点,
//这里参数传递用了参数的地址传递,p与tree共同指向同一个地址空间
if(p==NULL){
node *q=new node;
q->data=data;
q->lc=q->rc=NULL;
p=q;
return;
}
else {
if(p->data<data)
insert(p->rc,data);
else
insert(p->lc,data);
}
}
void dlr(node *p)
{
if(p==NULL) return;
printf("%c",p->data);
dlr(p->lc);
dlr(p->rc);
}
int main()
{ freopen("in.txt","r",stdin);
while(scanf("%s",str)>0) {
int len=strlen(str);
char ch;
for(; ;) {
scanf("%c",&ch);
if(ch>='A'&&ch<='Z')
str[len++]=ch;
else
if(ch=='*'||ch=='$') break;
}
tree=NULL;
for(int i=len-1;i>=0;i--)
insert(tree,str[i]);
dlr(tree);
printf("\n");
if(ch=='$') break;
}
return 0;
}
插入也可以用带返回值的函数
node *insert(node*p,char data)
{
if(p==NULL){
node *q=new node;
q->data=data;
q->lc=q->rc=NULL;
return q;
}
else {
if(p->data<data)
p->rc=insert(p->rc,data);
else
p->lc=insert(p->lc,data);
return p;
}
}
引用函数的用法:
tree=NULL;
for(int i=len-1;i>=0;i--)
tree=insert(tree,str[i]); //要赋值回来,要不tree还是null