思路:当时学长讲了之后,似乎有点思路----------就是倒着建一个  二叉搜索树

代码1:超时

详见超时原因

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std; char c[100][100];
struct node
{
char c;
node *lchild;
node *rchild;
}; void f(node *p)//前序遍历输出,用递归
{
printf("%c",p->c);
if(p->lchild!=NULL)
f(p->lchild);
if(p->rchild!=NULL)
f(p->rchild);
} int main()
{
int i;
int j;
int exit;
exit=0;
while(1)
{
memset(c,'\0',sizeof(c));
i=0;
while(1)
{
scanf("%s",c[i]);
if(c[i][0]=='*'||c[i][0]=='$')
{
if(c[i][0]=='$')
exit=1;
break;
}
i++;
}
i--;
node *p=new node;
p->c=c[i][0];
p->lchild=NULL;
p->rchild=NULL;
i--;
node *p2;
while(1)//遍历i
{
j=0;
while(1)//遍历j
{
p2=p;
node *p3=new node;//存储字母节点
p3->c=c[i][j];
p3->lchild=NULL;
p3->rchild=NULL;
while(1)//把字母挂到树中
{
if(p3->c < p2->c)
{
if(p2->lchild==NULL)
{
p2->lchild=p3;
break;
}
else if(p2->lchild!=NULL)//超时原因
p2=p2->lchild;
}
else if(p3->c > p2->c)//超时原因
{
if(p2->rchild==NULL)
{
p2->rchild=p3;
break;
}
else if(p2->rchild!=NULL)//超时原因,这三处的 else if() 判断多余,应直接写成else
p2=p2->rchild;
}
}
j++;
if(c[i][j]=='\0')
break;
}
i--;
if(i==-1)//修正超时原因后,此处会造成 runtime error,因为i为 -1时 也会 进入此while循环,数组越界
break;
}
f(p);
printf("\n");
if(exit==1)
break;
}
return 0;
}

修正代码:

1.

当时也是看了一下网上的一篇代码,看到他用的是一个结构体数组,我在考虑是不是动态开辟结构体浪费了时间,于是我改成用结构体数组,结果还是超时。

看来并非单单是数组这个原因造成我的代码超时( 当然我感觉,数组应该确实 比动态 开辟 省点时间)

2.

然后我继续想。。。

我突然间想到一个问题,那就是在我的代码中,有几句这样的 语句

if(p2->lchild==NULL)
{
p2->lchild=p3;
break;
}
else if(p2->lchild!=NULL)//超时原因
p2=p2->lchild;

看到没有? 就是有一些没必要的判断,

在           if(p2->lchild==NULL)  这一句判断完之后,

下面的  else if(p2->lchild!=NULL)//超时原因    这一句纯属多余

于是我就抱着试试看的心态改了一下。

改过来之后 ,发现超时原因的确如此。

之所以这么写,我还是感觉自己容易出错,有时候考虑不周,所以都加上了 if() 条件判断,当时是为了避免出错 ,才这么写的。

所以养成了一点点的习惯这么写。

没想到。。。。这么写后造成超时,看来还是得改正这种写法,没必要的判断别用  -----------直接用   else   语句

代码2:正确

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std; char c[100][100];
struct node
{
char c;
node *lchild;
node *rchild;
}; void f(node *p)//前序遍历输出,用递归
{
printf("%c",p->c);
if(p->lchild!=NULL)
f(p->lchild);
if(p->rchild!=NULL)
f(p->rchild);
} int main()
{
int i;
int j;
int exit;
exit=0;
while(1)
{
memset(c,'\0',sizeof(c));
i=0;
while(1)
{
scanf("%s",c[i]);
if(c[i][0]=='*'||c[i][0]=='$')
{
if(c[i][0]=='$')
exit=1;
break;
}
i++;
}
i--;
node *p=new node;
p->c=c[i][0];
p->lchild=NULL;
p->rchild=NULL;
i--;
node *p2;
while(i>=0)//遍历i --------此处为修改的上面代码 ( 修改前出现了 runtime error ),应该 把 i > = 0 的 判断放在前面
{
j=0;
while(1)//遍历j
{
p2=p;
node *p3=new node;//存储字母节点
p3->c=c[i][j];
p3->lchild=NULL;
p3->rchild=NULL;
while(1)//把字母挂到树中
{
if(p3->c < p2->c)
{
if(p2->lchild==NULL)
{
p2->lchild=p3;
break;
}
else // 修正 上面代码
p2=p2->lchild;
}
else // 修正 上面代码
{
if(p2->rchild==NULL)
{
p2->rchild=p3;
break;
}
else // 修正 上面代码
p2=p2->rchild;
}
}
j++;
if(c[i][j]=='\0')
break;
}
i--;
}
f(p);
printf("\n");
if(exit==1)
break;
}
return 0;
}

ps:再看这段代码,其实超时原因不是因为else if

而是p3->c > p2->c应该为p3->c >= p2->c

。。。

POJ 1577 Falling Leaves(二叉搜索树)的更多相关文章

  1. POJ 1577 Falling Leaves 二叉搜索树

    HDU 3791 Falling Leaves 二叉搜索树  Figure 1Figure 1 shows a graphical representation of a binary tree of ...

  2. 【二叉搜索树】poj 1577 Falling Leaves

    http://poj.org/problem?id=1577 [题意] 有一颗二叉搜索树,每次操作都把二叉搜索树的叶子从左到右揪掉(露出来的父节点就变成了新的叶子结点) 先给出了揪掉的叶子序列(多个字 ...

  3. Poj 2255 Tree Recovery(二叉搜索树)

    题目链接:http://poj.org/problem?id=2255 思路分析:根据先序遍历(如DBACEGF)可以找出根结点(D),其后为左右子树:根据中序遍历(如ABCDEFG),已知根结点(D ...

  4. POJ 1577 Falling Leaves (子母二叉树,给出叶子节点的删除序列,求前序遍历)

    题意:给出一棵字母二叉树删除叶子节点的序列,按删除的顺序排列.让你输出该棵二叉树额前序遍历的序列.思路:先把一棵树的所有删除的叶子节点序列存储下来,然后从最后一行字符串开始建树即可,最后遍历输出.   ...

  5. POJ 1577 Falling Leaves

    题意:给出一些字符串,从上到下的建树,输出其前序遍历 像前面那一题一样,先建树,然后再递归前序遍历 不过想像上一题那样用数组建树,建树和上题一样的办法,可是应该怎么输出前序遍历呢= = 还是看的题解= ...

  6. POJ 2309 BST(二叉搜索树)

    思路:除以2^k,找到商为奇数的位置,k为层数,有2^(k+1)-1个节点 这里直接用位运算,x & -x 就求出 2^k 了. #include<iostream> using ...

  7. 二叉搜索树 POJ 2418 Hardwood Species

    题目传送门 题意:输入一大堆字符串,问字典序输出每个字符串占的百分比 分析:二叉搜索树插入,然后中序遍历就是字典序,这里root 被new出来后要指向NULL,RE好几次.这题暴力sort也是可以过的 ...

  8. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  9. PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由

    03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...

随机推荐

  1. 篇二、理解Android Studio的视图和目录分析,这个是转载

    看不清的话可以可以将图片在新窗口中打开,以原图的大小显示.   原文链接:http://blog.csdn.net/siyehuazhilian/article/details/42123563   ...

  2. 配置LANMP环境(8)-- 安装Samba与配置

    Samba套件,将linux下的文件夹共享给windows(本地开发会很方便) 一.安装Samba yum install –y samba 二.配置Samba 1.备份配置文件 cp /etc/sa ...

  3. Windows server2008 搭建ASP接口訪问连接oracle数据库全过程记录

    真的是太不easy了,曾经的时候在window server 2003上面搭建了一套asp+oracle的接口系统.就费了好大的劲儿,事实上那会迷迷瞪瞪的也不知道怎么的就弄好了,也懒得管了.OK,从昨 ...

  4. github 答题

    头脑王者 / 百万英雄 / 冲顶大会 / 芝士超人 自动答题:https://github.com/cxs1994/python_answer 头脑王者:https://github.com/sear ...

  5. linux 常用的17个性能指标

    1.Average load:Average number of processes simultaneously in Ready state during the last minute.   上 ...

  6. ASIHTTP

    本文转载至 http://www.th7.cn/Program/IOS/201303/128223.shtml     向服务器端上传数据 ASIFormDataRequest ,模拟 Form表单提 ...

  7. [原创]webpack动态设置css路径

    在程序入口的最上方添加 __webpack_public_path__ = path; //your path //your app start here

  8. 九度OJ 1180:对称矩阵 (矩阵计算)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2637 解决:1354 题目描述: 输入一个N维矩阵,判断是否对称. 输入: 输入第一行包括一个数:N(1<=N<=100),表 ...

  9. ajax (异步js+xml)

    AJAX 基础 AJAX = 异步js+xml 通过与后台服务器进行少量数据交换,实现前台网页局部更新 XMLHttpRequest对象 是 AJAX 的基础 var xmlhttp; if (win ...

  10. ElasticSearch(二十一)正排和倒排索引

    1.区别 搜索的时候,要依靠倒排索引:排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序,所谓的正排索引,其实就是doc values 在建立索引的时候,一方面会建立 ...