二叉树之层次遍历

来源:互联网 发布:成本核算软件sap 编辑:程序博客网 时间:2024/06/17 04:02


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

任务要求:输入一棵二叉树,进行层次遍历,每个节点都按照从根节点到他的移动序列给出(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 + 100typedef 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;}

2 0
原创粉丝点击