1.输入前序 求后序中序。
2. 输入二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
3. 已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历
4. 已知一个按先序输入的字符序列,如abd,eg,cf,(其中,表示空结点)。请建立二叉树并求二叉树的层次遍历序列。
5. 一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历。
6. 已知二叉树的一个按先序遍历输入的字符序列,如abc,de,g,f, (其中,表示空结点)。请建立二叉树并求二叉树的叶子结点个数。
7. 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
8. 已知一个按先序输入的字符序列,如abd,eg,cf,(其中,表示空结点)。请建立该二叉树并按从上到下从左到右的顺序输出该二叉树的所有叶子结点。
9. 已知一颗二叉树的中序遍历序列和后序遍历序列,求二叉树的深度。
我们对应题目进行总结。
已知前序abc,de,g,f,
node *creat(node *root,char *str)//建树
{
if(str[++top]==',')
root= NULL;
else
{
root=new node;
root->data=str[top];
root->l=creat(root->l,str);
root->r=creat(root->r,str);
}
return root;
}
已知 先序和中序
tree *creat(int len,char s[60],char h[60])//头节点在先序。
{
int i;
tree *t;
if(len<=0)
return NULL;
t=(tree *)malloc(sizeof(tree));
t->date=s[0];
for(i=0;i<len;i++)
{
if(h[i]==s[0])
break;
}
t->l=creat(i,s+1,h);
t->r=creat(len-i-1,s+i+1,h+i+1);
return t;
}
已知中后 求先
node *creat(int n,char *str1,char *str2)//头节点在后序最后一个
{
int i;
node *p;
if(n==0)
return NULL;
p=new node;
p->data=str2[n-1];
for(i=0;i<n;i++)
{
if(str1[i]==str2[n-1])
break;
}
p->l=creat(i,str1,str2);
p->r=creat(n-i-1,str1+i+1,str2+i);
return p;
}
前中后序输出在这里就不写了。简单的递归。
写一下层序
void cengxu(tree *root)
{
tree *p[101];
int flas=0;
int glas=0;
if(root)
p[flas++]=root;
while(flas>glas)
{
root=p[glas++];
printf("%c",root->data);
if(root->l)
p[flas++]=root->l;
if(root->r)
p[flas++]=root->r;
}
}
接下来是叶子数
int leave(node *root)
{
if(root==NULL)
return 0;
if(root->l==NULL&&root->r==NULL)
return 1;
else
return leave(root->l)+leave(root->r);
}
还有树的深度
int depth(node *p)
{
int lt,rt,c;
if(!p)
c=0;
else
{
lt=depth(p->l);
rt=depth(p->r);
if(lt<rt)
{
c=rt+1;
}
else
{
c=lt+1;
}
}
return c;
}
最后就是 按从上到下从左到右的顺序输出二叉树的叶子结点。
void cengxu(node *root)//利用层序来逐层判断。
{
if(root==NULL)
{
return ;
}
int i=0;
int n=0;
node *a[100];
a[n++]=root;
while(i<n)
{
if(a[i])
{
if(a[i]->l==NULL&&a[i]->r==NULL)
printf("%c",a[i]->data);
if(a[i]->l!=NULL)
a[n++]=a[i]->l;
if(a[i]->r!=NULL)
a[n++]=a[i]->r;
}
i++;
}
}