递归创建树/求先,中,后序
#include<stdio.h>
#include<stdlib.h>
typedef struct Bitnode
{
char data;
struct Bitnode *lchild,*rchild;
}Bitnode,*Bitree;
void createnode(Bitree &t)
{
char ch;
ch=getchar();
if(ch==' ')
t=NULL;
else
{ t=(Bitree)malloc(sizeof(Bitnode));
if(t==NULL)
exit(-2);
t->data=ch;
createnode(t->lchild);
createnode(t->rchild);
}
}
void preorder(Bitree t)
{
if(t)
{
printf("%c",t->data);
preorder(t->lchild);
preorder(t->rchild);
}
}
void inorder(Bitree t)
{
if(t)
{
inorder(t->lchild);
printf("%c",t->data);
inorder(t->rchild);
}
}
void postorder(Bitree t)
{
if(t)
{
postorder(t->lchild);
postorder(t->rchild);
printf("%c",t->data);
}
}
int main()
{
Bitree t;
printf("请输入:\n");
createnode(t);
printf("先序:\n");
preorder(t);
printf("\n");
printf("中序:\n");
inorder(t);
printf("\n");
printf("后序:\n");
postorder(t);
printf("\n");
}
输入为abcdg^^^e^^c^f^^(^为空格)
请输入:
abdg e c f
先序:
abdgecf
中序:
gdbeacf
后序:
gdebfca
输入二叉树的先序序列,计算并输出该二叉树的深度与叶子节点个数。
例如,下面二叉树对应的先序序列为“AB#D##C##"。
A
/ \
B C
\
D
#include<stdio.h>
#include<stdlib.h>
typedef struct Bitnode
{
char data;
struct Bitnode *lchild,*rchild;
}Bitnode,*Bitree;
void createnode(Bitree &t)
{
char ch;
ch=getchar();
if(ch=='#')
t=NULL;
else
{ t=(Bitree)malloc(sizeof(Bitnode));
if(t==NULL)
exit(-2);
t->data=ch;
createnode(t->lchild);
createnode(t->rchild);
}
}
int high(Bitree t)
{ int h,hl,hr;
if(t==NULL)
h=0;
else if(!t->lchild&&!t->rchild)
h=1;
else
{
hl=high(t->lchild);
hr=high(t->rchild);
h=(hl>hr?hl:hr)+1;
}
return h;
}
int node(Bitree t)
{ int n,nl,nr;
if(t==NULL)
n=0;
else if(!t->lchild&&!t->rchild)
n=1;
else
{nl=node(t->lchild);
nr=node(t->rchild);
n=nl+nr;
}
return n;
}
int main()
{
Bitree t;
createnode(t);
printf("%d %d\n",high(t),node(t));
}
输入AB#D##C##
输出 3 2
};
#include<stdio.h>
#include<stdlib.h>
typedef struct Bitnode
{
char data;
struct Bitnode *lchild,*rchild;
}Bitnode,*Bitree;
void createnode(Bitree &t)
{
char ch;
ch=getchar();
if(ch==' ')
t=NULL;
else
{ t=(Bitree)malloc(sizeof(Bitnode));
if(t==NULL)
exit(-2);
t->data=ch;
createnode(t->lchild);
createnode(t->rchild);
}
}
void initstack()
{
}
void inorder2(Bitree t)
{
}
void preorder(Bitree t)
{
if(t)
{
printf("%c",t->data);
preorder(t->lchild);
preorder(t->rchild);
}
}
void inorder(Bitree t)
{
if(t)
{
inorder(t->lchild);
printf("%c",t->data);
inorder(t->rchild);
}
}
void postorder(Bitree t)
{
if(t)
{
postorder(t->lchild);
postorder(t->rchild);
printf("%c",t->data);
}
}
int main()
{
Bitree t;
printf("请输入:\n");
createnode(t);
printf("先序:\n");
preorder(t);
printf("\n");
printf("中序:\n");
inorder(t);
printf("\n");
printf("后序:\n");
postorder(t);
printf("\n");
}
#include<stdio.h>
#include<stdlib.h>
typedef struct Bitnode
{
char data;
struct Bitnode *lchild,*rchild;
}Bitnode,*Bitree;
void createnode(Bitree &t)
{
char ch;
ch=getchar();
if(ch=='#')
t=NULL;
else
{ t=(Bitree)malloc(sizeof(Bitnode));
if(t==NULL)
exit(-2);
t->data=ch;
createnode(t->lchild);
createnode(t->rchild);
}
}
int high(Bitree t)
{ if(t!=NULL)
printf("%c\n",t->data);
int h,hl,hr;
if(t==NULL)
h=0;
else if(!t->lchild&&!t->rchild)
h=1;
else
{
hl=high(t->lchild);
hr=high(t->rchild);
h=(hl>hr?hl:hr)+1;
}
return h;
}
int node(Bitree t)
{ int n,nl,nr;
if(t==NULL)
n=0;
else if(!t->lchild&&!t->rchild)
n=1;
else
{
nl=node(t->lchild);
nr=node(t->rchild);
n=nl+nr;
}
return n;
}
int main()
{
Bitree t;
createnode(t);
printf("%d %d\n",high(t),node(t));
}
*/
/*
按类似先序遍历结果输入一序列,建立一棵二叉树(算法6、4),输出二叉树中序与后序遍历的结果。
按类似先序遍历结果输入一序列,建立一棵二叉树(算法6、4),输出二叉树的高度。
按类似先序遍历结果输入一序列,建立一棵二叉树(算法6、4),输出二叉树的总结点数。
按类似先序遍历结果输入一序列,建立一棵二叉树(算法6、4),输出二叉树的叶子结点数。
*/
#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
typedef struct Bitnode
{
char data;
Bitnode *lchild,*rchild;
}Bitnode,*Bitree;
typedef struct
{
Bitree *base;
Bitree *top;
int stacksize;
}sqstack;
void createTree(Bitree &t)
{
char ch;
ch=getchar();
if(ch==' ')
t=NULL;
else{
t=(Bitree)malloc(sizeof(Bitnode));
if(t==NULL)
exit(-2);
t->data=ch;
createTree(t->lchild);
createTree(t->rchild);
}
}
void InitStack(sqstack &s)
{ s.base=(Bitree *)malloc(maxsize*sizeof(Bitree));
if(s.base==NULL)
exit(-2);
s.top=s.base;
s.stacksize=maxsize;
}
int GetTop(sqstack s,Bitree &e)
{
if(s.top==s.base)
return 0;
e=*(s.top-1);
return 1;
}
int push(sqstack &s,Bitree e)
{
if(s.top-s.base>=s.stacksize)
{
s.base=(Bitree *)realloc(s.base,(s.stacksize+maxsize)*sizeof(Bitree));
if(s.base==NULL)
exit(-2);
s.top=s.base+s.stacksize;
s.stacksize+=maxsize;
}
*s.top++=e;
return 1;
}
int pop(sqstack &s,Bitree &e)
{
if(s.top==s.base)
return 0;
e=*--s.top;
return 1;
}
void preorder(Bitree t)
{ sqstack s;
Bitree p;
InitStack(s);
if(t)
{
push(s,t);
while(s.base!=s.top)
{
pop(s,p);
printf("%c",p->data);
if(p->rchild)//先压右,因为栈是先进后出,后进先出
push(s,p->rchild);
if(p->lchild)//再压左
push(s,p->lchild);
}
}
}
void inorder(Bitree t)
{
sqstack s;
Bitree p;
InitStack(s);
push(s,t);
while(s.base!=s.top)
{
while(GetTop(s,p)&&p)
{
push(s,p->lchild);
}
pop(s,p);
if(s.top!=s.base){
pop(s,p);
printf("%c",p->data);
push(s,p->rchild);
}
}
}
int main()
{
Bitree t;
createTree(t);
inorder(t);
}
abd ef cg h k
dbfeagchk