12_4 静态二叉树的建立和遍历

sample1 input:

 4//结点个数
1 2 4//分别为编号和左右子树
2 0 3
3 0 0
4 0 0

sample1 output:

在这里插入图片描述

sample2 input:

7
5 4 3
4 2 1
3 7 9
2 0 0 
1 0 0
7 0 0
9 0 0

sample2 output:

在这里插入图片描述

AC代码

#include <stdio.h>
#define maxn 100
//静态树

typedef struct
{
    int parent;
    int left;
    int right;
}Node;


int findroot(Node T[])//返回根节点
{
//从第一个开始找
    int root=1;
    while(T[root].parent!=-1)
    {
        root=T[root].parent;
    }
    return root;
}


void PreOrder(Node T[],int root)
{
    if(root!=0)
    {
        printf("%d ",root);
        PreOrder(T,T[root].left);
        PreOrder(T,T[root].right);
    }
}


void MidOrder(Node T[],int root)
{
    if(root!=0)
    {
        MidOrder(T,T[root].left);
        printf("%d ",root);
        MidOrder(T,T[root].right);
    }
}

void PostOrder(Node T[],int root)
{
    if(root!=0)
    {
        PostOrder(T,T[root].left);
        PostOrder(T,T[root].right);
        printf("%d ",root);
    }
}


void LevelOrder(Node T[],int root)
{
    int Q[maxn];
    int front=-1,rear=-1,p;
    Q[++rear]=root;
    while(front<rear)
    {
        p=Q[++front];
        printf("%d ",p);
        if(T[p].left)Q[++rear]=T[p].left;
        if(T[p].right)Q[++rear]=T[p].right;
    }
}

int main()
{
    freopen("input.txt","r",stdin);
    int n;
    int a,b,c,root;
    scanf("%d",&n);//一共n个结点
   // printf("%d",n);
    Node T[n+1];
    for(int i=1;i<=n;i++)
        T[i].parent=-1;//初始化全部父节点为-1
    while(scanf("%d %d %d",&a,&b,&c)!=EOF)
    {
        T[a].left=b;
        T[a].right=c;
        T[b].parent=a;
        T[c].parent=a;
    }//初始化数,最后剩下根节点的parent为-1,方便找到根结点
    root=findroot(T);
    printf("前序遍历为:");
    PreOrder(T,root);
    printf("\n");
    printf("中序遍历为:");
    MidOrder(T,root);
    printf("\n");
    printf("后序遍历为:");
    PostOrder(T,root);
    printf("\n");
    printf("水平遍历为:");
    LevelOrder(T,root);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值