二叉树的层次遍历!!!

好久没有写这个东西了,不是我这几天颓废了,是这几天英语作业把我给整的,人生没有了理想了,

痛苦的英语作业。。。。。。



层次遍历 :

问题描述  :

输入一颗二叉树,你的任务就是从上到下,从左到右的顺序输出各个节点的数值,(简单的说就是使用宽度优先搜索)

每个节点都按照从根节点到他的移动序列给出(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


题目分析:

这样的题目一开始我还是要准备使用一个数组来做的,但是你有没有想过,这个一个256个节点的树,如果,这些节点都在一个方向,这个树将会十分的长,数组是放不下的,所以我想到了,链表。


树的建立就使用链表的方式。

访问就使用队列的方式。

/*
 *
 *层次遍历
 *using queue and BFS
 * is so hard
 * but i like
 *
 **/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
using namespace std;
typedef struct Tree{
    int num;
    int display;
    struct Tree *p_front;
    struct Tree *p_left,*p_right;
}TreeNode;
TreeNode *p_pre = NULL,*p_now = NULL;

TreeNode *createNode(int num,TreeNode *p_front){
    TreeNode *p_node = (TreeNode *) malloc (sizeof(TreeNode));
    p_node->num = num;
    p_node->display = 0;
    p_node->p_front = p_front;
    p_node->p_left = NULL;
    p_node->p_right= NULL;
    return p_node;
}



void createTree(int num,char *p_buf){
    int i = 0;
    while(*(p_buf+i) != ','){
        i++;
    }
    p_now = p_pre;
    while(*(p_buf+i) != ')'){
        //printf("i = %d\n",i);
        if(!p_pre){
            p_pre = createNode(num,NULL);
            p_now = p_pre;
        }
        if(!p_now->p_left && *(p_buf+i) == 'L' && *(p_buf +i+1) != ')'){
            TreeNode *p_node = createNode(0,p_now);
            p_now->p_left = p_node;
            p_now = p_node;
            //continue;
        }
        else if(p_now->p_left && *(p_buf+i) == 'L' && *(p_buf +i+1) != ')'){
            p_now = p_now->p_left;
            //continue;
        }
        if(!p_now->p_right && *(p_buf+i) == 'R' && *(p_buf +i+1) != ')'){
            TreeNode *p_node = createNode(0,p_now);
            p_now->p_right = p_node;
            p_now = p_node;
            //continue;
        }
        else if(p_now->p_right && *(p_buf+i) == 'R' && *(p_buf +i+1) != ')'){
            p_now = p_now->p_right;
            //continue;
        }
        if(!p_now->p_left && *(p_buf+i) == 'L' && *(p_buf +i+1) == ')'){
            TreeNode *p_node = createNode(num,p_now);
            p_now->p_left = p_node;
            p_now = p_node;
            p_now->display = 1;
            //continue;
        }
        else if(p_now->p_left && *(p_buf+i) == 'L' && *(p_buf +i+1) == ')'){
            p_now = p_now->p_left;
            p_now->num = num;
            p_now->display = 1;
            //continue;
        }
        if(!p_now->p_right && *(p_buf+i) == 'R' && *(p_buf +i+1) == ')'){
            TreeNode *p_node = createNode(num,p_now);
            p_now->p_right = p_node;
            p_now = p_node;
            p_now->display = 1;
            //continue;
        }
        else if(p_now->p_right && *(p_buf+i) == 'R' && *(p_buf +i+1) == ')'){
            p_now = p_now->p_right;
            p_now->num = num;
            p_now->display = 1;
            //continue;
        }
        if(p_now && *(p_buf+i+1) == ')' && *(p_buf+i) == ','){
            p_now->display = 1;
            //printf("jkl\n");
            p_now->num = num;
        }
        i++;
    }
}

int BFS(TreeNode *p_pre,int *p_arr,int *count){
    queue<TreeNode *>s;
    s.push(p_pre);
    TreeNode *p_node = NULL;
    while(!s.empty()){
    p_node = s.front();
    s.pop();
    if(p_node->display == 0){
        return -1;
    }
    else {
        *(p_arr+(*count)) = p_node->num;
        (*count)++;
        if(p_node->p_left){
            s.push(p_node->p_left);
        }
        /*else if( p_node->p_left->p_left || p_node->p_left->p_right){
            return -1;
        }*/
        if(p_node->p_right){
            s.push(p_node->p_right);
        }
        /*else if(p_node->p_right->p_left || p_node->p_right->p_right){
            return -1;
        }*/

        }
    }
    return 0;
}


void LookArr(int arr[],int *p_count){
    int i = 0;
    for(i = 0;i < *p_count;i++){
        printf("%d",arr[i]);
        i != (*p_count-1) && printf(" ");
    }
    printf("\n");
}



int main( void ){
    int count = 0;
    char buffer[1000] = {};
    int arr[1000] = {};
    while(scanf("%s",buffer) && strcmp(buffer,"()")){
        int num = 0;
        sscanf(&buffer[1],"%d",&num);
        createTree(num,buffer);
    }
    if(BFS(p_pre,arr,&count) == -1){
    LookArr(arr,&count);
        printf("-1\n");
        return 0;
    }
    LookArr(arr,&count);
    return 0;
}

我虽然这样写了。链表,但是在这个代码中我并没有释放链表。造成内存泄露


/*
 *
 * using BFS and queue
 *
 **/
#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<string.h>
using namespace std;

typedef struct Tnode{
    int have_value;
    int v;
    struct Tnode *left,*right;
}Node;

Node* root;



Node* newnode(){
    Node* u = (Node*) malloc (sizeof(Node));
    if(u != NULL){
        u->have_value = 0;
        u-left = u->right = NULL;
    }
    return 0;
}

void addnode(int v,char* s){
    int n = strlen(s);
    Node* u = root;
    for(int i = 0;i < n;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->have_value) failed = 1;
    u->v = v;
    u->have_value = 1;
}

int n = 0;
int ans[MAXN];
int bfs(){
    int front = 0;
    int rear = 1;
    Node *q[MAXN];
    q[0] = root;
    while(front < rear){
        Node *u = q[front++];
        if(!u->have_value) return 0;
        ans[n++] = u->v;
        if(u->left != NULL)q[rear++] = u->left;
        if(u->right != NULL) q[rear++] = u->right;
    }
    return 1;
}

void remove_tree(Node *u){
    if(u == NULL) return ;
    remove_tree(u->left);
    remove_tree(u->right);
    free(u);
}





char s[MAXN+10];
int read_input(){
    failed = 0;
    root = newnode();
    for(;;){
        if(scanf("%s",s) != 1) return 0;
        if(!strcmp(s,"()")) break;
        int v;
        sscanf(&s[1],"%d",&v);
        addnode(v,strchr(s,',')+1);
    }
    return 1;
}



int main( void ){
    return 0;
}

这是改进的方法,但是都是不完全的代码。









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值