UVA.122 Trees on the level(二叉树 BFS)

本文介绍了一个基于UVA.122 Trees on the level的二叉树层序遍历问题,并提供了完整的C++实现代码。通过输入节点之间的关系,程序能够进行层序遍历并输出节点值,同时判断树是否完整。

UVA.122 Trees on the level(二叉树 BFS)

题意分析

给出节点的关系,按照层序遍历一次输出节点的值,若树不完整,则输出not complete

代码总览

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define nmax 10000
using namespace std;
bool failed;
struct node{
    bool isvalue;
    node * left, *right;
    int val;
    node():isvalue(false),left(NULL),right(NULL){}
};
node* root;
//node* roott;
char s[nmax];
node* newnode()
{
    return new node();
}
bool addnode( int v, char * str)
{
    int len = strlen(str);
    node*t = root;
    for(int i = 0; i<len; ++i){
        //if(len == 1)
        if(str[i] == 'L'){
            if(t->left == NULL) t->left = new node();
            t = t->left;
        }else if(str[i] == 'R'){
            if(t->right == NULL) t->right = new node();
            t = t->right;
        }
    }
    if(t->isvalue == true) failed = true;
    t->val = v;
    t->isvalue = true;
    return true;
}
bool read_input()
{
    failed = false;
    root = newnode();
    for(;;){
        if(scanf("%s",s) !=1) return false;
        else{
            int v;
            if(!strcmp(s,"()")) break;
            sscanf(&s[1],"%d",&v);
            addnode(v,strchr(s,',')+1);
        }
    }
    return true;
}

bool bfs(vector<int> & ans)
{
    queue<node*> q;
    ans.clear();
    q.push(root);
    while(!q.empty()){
        node* t = q.front();q.pop();
        if(t ->isvalue == false ) {failed = true; break;}
        ans.push_back(t->val);
        if(t){
            if(t->left)q.push(t->left);
            if(t->right)q.push(t->right);
        }
    }
    return true;

}
int main()
{
    //freopen("in.txt","r",stdin);
    vector<int> ans;
    //roott = newnode();
    while(read_input()){
        bfs(ans);
        if(failed) printf("%s\n","not complete");
        else{
            bool flag = false;
            for(int i = 0; i<ans.size();++i){
                if(i == 0) printf("%d",ans[i]);
                else printf(" %d",ans[i]);
            }
            printf("\n");
        }
    }
    return 0;
}
先展示下效果 https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值