1. 程式人生 > >YTU OJ2344: 先序遍歷二叉樹

YTU OJ2344: 先序遍歷二叉樹

2344: 先序遍歷二叉樹

給定一顆二叉樹,要求輸出二叉樹的深度以及先序遍歷二叉樹得到的序列。本題假設二叉樹的結點數不超過1000。

輸入

輸入資料分為多組,第一行是測試資料的組數n,下面的n行分別代表一棵二叉樹。每棵二叉樹的結點均為正整數,資料為0代表當前結點為空,資料為-1代表二叉樹資料輸入結束,-1不作處理。二叉樹的構造按照層次順序(即第1層1個整數,第2層2個,第3層4個,第4層有8個......,如果某個結點不存在以0代替),比如輸入:

1 2 0 3 4 -1得到的二叉樹如下:

1

2 #

3 4

輸出

輸出每棵二叉樹的深度以及先序遍歷二叉樹得到的序列。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<malloc.h>
#include<math.h>
using namespace std;
typedef struct Node
{
    int data;
    struct Node *lchild;
    struct Node *rchild;
}BTNode;
int depth=0;
void CreatBTree(BTNode *T)
{
    BTNode *a[110];
    BTNode *p=T;
    int rear=0;
    while(cin>>p->data&&p->data!=-1)
    {
        a[++rear]=p;
        if(rear/2!=0)
        {
            if(rear%2)
            {
                a[rear/2]->rchild=p;
            }
            else
            {
                a[rear/2]->lchild=p;
            }
        }
        p->lchild=NULL;
        p->rchild=NULL;
        p=(BTNode *)malloc(sizeof(BTNode));
    }
    depth=(int)ceil(log2(rear+1));
}
void preOrder(BTNode *T)
{
    if(T!=NULL)
    {
        printf(T->data?" %d":"",T->data);
        preOrder(T->lchild);
        preOrder(T->rchild);
    }
}
int main()
{
    int n;
    BTNode *T;
    T=(BTNode *)malloc(sizeof(BTNode));
    scanf("%d",&n);
    while(n--)
    {
        CreatBTree(T);
        printf("%d",depth);
        preOrder(T);
        printf("\n");
    }
    return 0;
}