二叉树遍历(二)

问题 A: 数据结构作业04 -- 二叉树的输入

时间限制: 1 Sec  内存限制: 128 MB
提交: 1904  解决: 593
[提交][状态][讨论版]

题目描述

用二叉树的带虚结点表示的前序遍历序可以唯一的确定一棵二叉树。

输入

每行是一棵二叉树的带虚结点(#)表示的前序遍历序串,长度不超过2000。每个结点为一个小写字母或一个数字。

输出

对每行输入,输出对应二叉树的中序遍历序(不含虚结点)、后序遍历序(不含虚结点)和层次遍历序(不含虚结点)。 每棵二叉树的输出占一行,中序遍历序、后序遍历序和层次遍历序之间用一个空格隔开。

样例输入

ab##c##
#
ab###

样例输出

bac bca abc
  
ba ba ab

提示

Sample Input的第二行表示一棵空树,因此输出时输出两个空格。


#include "bits/stdc++.h"
using namespace std;
struct Binode
{
    char data;
    Binode *lchild,*rchild;
};

typedef Binode *Bitree;
Bitree T1;

int InitBiTree(Bitree &T)
{
    T = NULL;
    return 0;
}


// 用带虚结点的前序遍历串str(每个字符对应一个结点)构造二叉树T,并返回剩余字符串
char *CreateBiTree(Bitree &T, char *str)
{
// 约定#表示空结点
    if (*str == '#')
    {
        T = NULL;
        return str + 1;
    }

// 创建结点
    T = new Binode;
    T->data = *str;

// 继续输入并构造左子树和右子树
    str = CreateBiTree(T->lchild, str + 1);
    str = CreateBiTree(T->rchild, str);

// 返回剩余的字符串
    return str;
}
int InTraverse(Bitree T)
{
    if (T == NULL) return 0;
    InTraverse(T->lchild);
    cout << T->data ;
    InTraverse(T->rchild);
    return 0;
}

int SucTraverse(Bitree T)
{
    if (T == NULL) return 0;
    SucTraverse(T->lchild);
    SucTraverse(T->rchild);
    cout << T->data ;
    return 0;
}
queue<Bitree>a;
int cengci(Bitree T)
{
    if(T == NULL) return 0;
    a.push(T);
    while(!a.empty())
    {
        cout << a.front()->data;

        if(a.front()->lchild != NULL)
            a.push(a.front()->lchild);
        if(a.front()->rchild != NULL)
            a.push(a.front()->rchild);
        a.pop();

    }
    return 0;
}

int main()
{
    char s[3000];
    char *str1;
    while(cin >> s)
    {
        str1 = s;
        InitBiTree(T1);
        CreateBiTree(T1,str1);
        InTraverse(T1);
        cout << " ";
        SucTraverse(T1);
        cout << " ";
        cengci(T1);
        cout << endl;
    }

    return 0;
}

哈哈哈哈,层次遍历被我想出来啦啦啦阿拉啦啦啦啦啦啦啦啦

原文地址:https://www.cnblogs.com/cunyusup/p/7923372.html