二叉树之层次遍历



       下面是对层次遍历的一个实例,如果对二叉树不太了解请点击这里,另外对于二叉树其他的三种遍历方式:请点击这里

任务要求:输入一棵二叉树,进行层次遍历,每个节点都按照从根节点到他的移动序列给出(L表示左,R表示右)。在输入中,每个节点的左右括号之间没有空格,相邻节点之间用一个空格隔开。每棵数的输入用一队空括号 () 表示结束(这对括号本身并不代表一个节点),如图所示。

《二叉树之层次遍历》(画的略丑)

注意:如果从根到某个叶节点的路径上有的节点没有在输入中给出,或者给出超出了一次应当输出 -1.节点数不超过 256.

样例输入:

(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()

(3,L) (4,R) ()

样例输出:

5 4 8 11 13 4 7 2 1

-1

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 1500 + 100
typedef struct TNode    //定义树结构
{
    bool is_value;      //是否被赋值过
    int v;              //节点值
    TNode *left, *right;//左儿子和右儿子
}Node;
Node* root; //二叉树的根节点
bool failed;
int ans[MAXN],cnt;
//功能:申请新节点并初始化
Node* newnode(){
    Node* u = (Node*)malloc(sizeof(Node));
    if(u != NULL ){
        u->is_value = false;
        u->left = u->right = NULL;
    }
    return u;
}
//功能:程序运行结束之前先释放内存
void remove_tree(Node* u){
    if(u == NULL) return ;
    remove_tree(u->left);
    remove_tree(u->right);
    free(u);
}
//功能:将给定的序列加入树,若不存在则使用newnode创建新节点
void addnode(int v,char *s){
    int nLen = strlen(s);
    Node* u = root;             //从根节点往下走
    for(int i = 0; i < nLen; i++){
        if(s[i] == 'L'){
            if(u->left == NULL) u->left = newnode();    //节点不存在,建立新节点
            u = u->left;                    //往左走
        }else if(s[i] == 'R'){
            if(u->right == NULL) u->right = newnode();
            u = u->right;                   //往右走
        }
    }           //忽略其他情况,即最后那个多余的括号
    if(u->is_value) failed = true;  //已经赋过值,表明输入有误
    u->v = v;
    u->is_value = true;
}
void input_tree(){
    char s[MAXN];   //保存读入节点
    failed = false;
    root = newnode(); //创建根节点
    while(scanf("%s",s),strcmp(s,"()")){ //读到结束标志退出循环
        int v;
        sscanf(&s[1],"%d",&v);    //读入节点值
        addnode(v,strchr(s,',')+1);  //查找逗号,插入节点
    }
    return ;
}
bool bfs(){
    Node *q[MAXN],*u;
    q[0] = root;
    int front = 0, rear = 1;
    while(front < rear){
        u = q[front++];
        if(!u->is_value) return false;  //没有被赋过值,表明输入有误
        ans[cnt++] = u->v;                //增加到输出序列的尾部
        if(u->left != NULL) q[rear++] = u->left; //把左儿子放入队列
        if(u->right != NULL) q[rear++] = u->right;//把右儿子放入队列
    }
    return true;        //输入正确
}
int main(){
    while(1){
        cnt = 0;
        input_tree();
        if(!failed&&bfs()){      //判断是否有重复输入或者节点中断
            for(int i = 0; i < cnt; i++){   //按照层次遍历输出二叉树
                if(i) printf(" ");
                printf("%d",ans[i]);
            }
            printf("\n");
        }
        else
            printf("-1\n");
    }
    return 0;
}

    原文作者:Enstein_Jun
    原文地址: https://blog.csdn.net/luomingjun12315/article/details/45217001
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞