二叉树的层次遍历(建树,遍历,释放)

这题的思路:读入--》判断是否为循环结束的条件(主动)--》判断是否
输入错误--》用队列向vector中输入合法数据--》按顺序输出

a)        编写readin函数,专门用来读取数据。函数返回类型为bool,输入不合法时返回false。依题意,如果输入只有(),表示input终止,跳出循环并返回true

b)        编写名为Node的结构体。结构体中包含input中括号左侧的结值、判断结点是否被赋值的bool类型的值,和类型为Node *的左右子结点。由于二叉树是递归定义的,其左右子结点类型都是“指向结类型的指针”,因此左右子结点的类型都是Node *

c)        建立全局变量failed,记录是否有从根到某个叶结的路径上有的结没有在输入中给出或值给出超过一次的情况

d)        建立函数addnode:按照移动序列走,目标不存在时调用newnode函数来创造新结点,判断结点是否已被赋值(如果已经被赋过值,将failed值改为true),并将结点值赋给对应的结点

e)        bfs找结点,使用队列:初始时只有一个根结点,然后每次取出一个结点,把它的左右子结点(如果存在)放进队列中,用vector保存结点的值

PS:failed 仅仅是作为continue的条件 真正退出的条件只能是readin读入到了结束
failed在外部函数中出现在了readin里的addnode函数里 作为重复赋值的判断
然后在bfs里有一个是否complete的判断 也与failed一样作为能否进入为vector赋值的条件

readin—》addnode—》bfs—》over


include<vector>

include<cstdio>

include<queue>

include<iostream>

include<cstring>

using namespace std;

const int maxn = 256 + 10;
char s[maxn];
bool failed;

struct Node{
int v; //结点值
bool have_value; //用来判断是否被赋值过
Node *left, *right; //递归定义 左右结点
};
Node *root;

Node *newnode(){
return new Node(); //每建立一个结点 用new运算符申请
}

void addnode(int v,char *s){
Node *u = root; //将根节点指向的地址赋给u进行储存
int n = strlen(s); //确定循环次数
for(int i = 0; i < n; n++){
if(s[i] == 'L'){
if(u->left==NULL){ //如果这个结点未被创建
u->left = newnode();//那么创建它
u = u->left; //并且将u指向它以进行下一次循环
}
}
else if(s[i] == 'R'){
if(u->right==NULL){ //同上
u->right=newnode();
u = u->left;
}
}
if(u->have_value) failed = true;//如果它已经被创建 那么把标记值赋为ture 以在主函数中终止此次循环
u->v=v; //将值赋给新创建的结点
u->have_value=true; //并做标记,表示该结点已经赋过值
}
}

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

bool readin(){ //这个函数是用来读入的
failed = false;
remove_tree(root);
root = newnode(); //创建根结点 可能导致内存泄漏
for( ; ; ){
if(scanf("%s", s) != 1) return false;//读到了结束标志
if(strcmp(s,"()")) break;//比较字符串是否相等
//按照顺序比,第一个都是T 第二个都是h 第三个a<e 所以...就这样。比较方法就是挨个比较,利用ASCII码
//相等返回0 大于返回正整数 小于返回负整数
int v;
sscanf(&s[1],"%d",&v); //不管了...
addnode(v,strchr(s,',')+1);//不管 看不懂
}
return true ;
}

bool bfs(vector<int>&ans){
queue<Node*> q; //创建队列以存放结点
q.push(root); //将已经创建好的树的根节点放入队列
while(!q.empty()){ //当队列不为空(即未全部按顺序加入vector完)
Node *u = q.front(); //创建结构指针 指向队列头
q.pop(); //出列
if(!u->have_value) return false;//如果该结点未被赋值过 则树不完整 返回false 在主函数中结束此次循环
if(u->left!=NULL) q.push(u->left); //若不为空 则加入队列中
if(u->right!=NULL) q.push(u->right);//注意先左再右(题目要求)
}//有些树可能have_value是空的 但是仍为一些结点的根节点
return true;
}

int main(){
while(1){
if(!readin()) break;

    vector<int>ans;
    if(!failed&&bfs(ans)){
        int len = ans.size();
        for(int i = 0; i < len; i++){
            printf("%d%c",ans[i],i == len-1?'\n':' ');
        }
    }
    else 
        printf("not complete");
}
return 0;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352