二叉树的基本算法


以括号形式输出二叉树

输入一个二叉树的先序串,输出以括号形式表示的而叉树。如果结点的子树为空,先序串的对应位置为空格符。

Input

第1行:先序串 (结点数≤26,以单个大写字母表示)

Output

第1行:二叉树的括号形式

Sample Input

AB C  D  

Sample Output

A(B( ,C( , )),D( , ))

Code

#include<cstdio>
#include<cstring>
char s[100];
int len,x;
void dg()
{
    printf("%c",s[x]);
    if(s[x]==' ')return;
    printf("(");
    x++;
    dg();
    printf(",");
    x++;
    dg();
    printf(")");
}
int main()
{
    gets(s);
    len=strlen(s);
    dg();
    return 0;
}

由于这里只讲二叉树,所以没有多叉树的遍历,但我推荐一个博客,里面面有多叉树的遍历方法(其实多叉树和二叉树的遍历差不多)。
多叉树的遍历

二叉树的遍历

给出一棵二叉树,分别输出先序、中序、后序遍历结果。

Input

第1行:结点数n(1<=n<=100)
以下若干行,每行3个整数,分别表示父结点、左孩子、右孩子。若没有孩子,对应的整数为0.

Output

第1行:树根
第2行:先序遍历结果,数字间用1个空格分开。
第3行:中序遍历结果,数字间用1个空格分开。
第4行:后序遍历结果,数字间用1个空格分开。

Smple Input

8
1 2 4
2 0 0
4 8 0
3 1 5
5 6 0
6 0 7
8 0 0
7 0 0

Sample Output

3
3 1 2 4 8 5 6 7
2 1 8 4 3 6 7 5
2 8 4 1 7 6 5 3

Code

#include<cstdio>
int n,root,ll;//ll行末多余空格,root根节点
struct shu
{
    int p,l,r;
    //p存父亲,l存左儿子,r存右儿子
}t[105];
void first(int x)
{
    if(x==0)return;//没有儿子(叶节点)
    ll++;
    if(ll==n) printf("%d\n",x);//行末
    else printf("%d ",x);
    first(t[x].l);//递归左儿子
    first(t[x].r);//递归右儿子
}
void middle(int x)
{   
    if(x==0)return;
    middle(t[x].l);//递归左儿子
    ll++;
    if(ll==n) printf("%d\n",x);
    else printf("%d ",x);
    middle(t[x].r);//递归右儿子
}
void last(int x)
{
    if(x==0)return;
    last(t[x].l);
    last(t[x].r);
    ll++;
    if(ll==n) printf("%d\n",x);
    else printf("%d ",x);
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        t[y].p=t[z].p=x;//预处理
        t[x].l=y;
        t[x].r=z;
    }
    for(int i=1;i<=n;i++)//找根节点
        if(t[i].p==0) root=i;
    printf("%d\n",root);
    first(root);ll=0;//先序
    middle(root);ll=0;//中序
    last(root);//后序
    return 0;   
}

求二叉树的深度

给出一棵二叉树,求该二叉树的深度。

Input

第一行给出节点个数n。(n<100)
接下来n行,每行给出两个数。依次表示节点1到节点n的左儿子和右儿子。如果左儿子为0,表示没有左儿子,如果右儿子为0,表示没有右儿子

Output

一个整数,表示二叉树的深度。

Sample Input

7
2 3
4 5
6 7
0 0
0 0
0 0
0 0

Sample Output

3

Code

#include<cstdio>
int n,ans,rot,mx=-1;//mx存树的深度,ans存递归时节点深度
struct shu
{
    int l,r,p;//储存二叉树
}a[105];
void ser(int x,int ans)//递归求深度
{
    if(x==0)return;//倒底之后返回
    if(ans>mx)mx=ans;//存最大深度,因为那才是树的深度
    ser(a[x].l,ans+1);//左子树
    ser(a[x].r,ans+1);//右子树
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i].l,&a[i].r);//存儿子
        a[a[i].l].p=a[a[i].r].p=i;//存父亲
    }
    for(int i=1;i<=n;i++)
        if(!a[i].p){rot=i;break;}//存根节点
    ser(rot,1);//求深度
    printf("%d\n",mx);
    return 0;
}

多叉树转二叉树

猜你喜欢

转载自blog.csdn.net/qq_38956769/article/details/78832047