我对数据结构使用的时间比较长久,而且解决过很多问题。 感觉您这道题目根本用不到这么复杂的设计。 对与这个需求,建议解决办法下: 1.这三个数保存在一个循环列表中。(循环列表应该是最简单的数据结果了。) 在方法体内部,对列表内数据循环三次,每次,都进行“统一”规则判断。 2.具体如下: public String getTrangleType(int aa,int bb,int cc) { String type="Common triangle"; //一般三角形; if( (aa > 0 && bb > 0 && cc > 0) && (aa + bb > cc && aa + cc > bb ) ) { int[] d = new int[3]; d[0] = aa; d[1] = bb; d[2] = cc; int a, b, c; for (int i = 0; i < d.length; i++) { //实现列表循环,对循环列表取值 a = d[i]; b = d[ (i + 1) % d.length]; c = d[ (i + 2) % d.length]; if(a == b && b == c) { type = "equilateral triangle";//等边三角形 break; } else if(a==b) { if(a * a + b * b == c * c) { type = "isoceles and right-angled triangle"; //等腰直角三角形 } else type = "isoceles triangle"; //等腰三角形 break; } else if(a * a + b * b == c * c) { type = "right-angled triangle"; //直角三角形 } } } else type="failed to construct triangle"; return type; }
受各位关于树的意见的启发,我定义了一个叫“三叉树”数据结构,大家讨论一下:一、 三叉树结点数据结构 public class ThreeTreeNode { private String key; //结点关键字 public ThreeTreeNode left; public ThreeTreeNode middle; public ThreeTreeNode right; public int layer; //结点所在的层数 ………………………… }二、三叉树逻辑定义 1、 根结点为空。 2、 结点的左孩子指向嵌套的if语句。 3、 结点的中孩子指向与之匹配的else if和else语句块 4、 结点的右孩子指向与之串行的if语句。 5、 叶子结点的左、中、右孩子均为空三叉树类数据结构: public class ThreeTree { public ThreeTreeNode root; …………………………….. }
应该是这样: public class TreeNode { //标记此节点的性质, public String ;}
(sorry,刚才又按tab键和空格了) 应该是这样: public class TreeNode { //标记此节点的性质 //0表示节点为二叉树 1表示此节点为森林 2表示此节点为叶子 public String nodeType; //如果此节点为树,定义左子树,右子树,及其父亲。 public TreeNode left,right,parent; //如果此节点为身林,定义身林内的兄弟 public TreeNode[] brothers; //如果此节点为叶子,定义叶子内保存的节点数值 public String nodeValue; }
感觉您这道题目根本用不到这么复杂的设计。
对与这个需求,建议解决办法下:
1.这三个数保存在一个循环列表中。(循环列表应该是最简单的数据结果了。)
在方法体内部,对列表内数据循环三次,每次,都进行“统一”规则判断。
2.具体如下:
public String getTrangleType(int aa,int bb,int cc)
{
String type="Common triangle"; //一般三角形;
if( (aa > 0 && bb > 0 && cc > 0)
&& (aa + bb > cc && aa + cc > bb ) )
{
int[] d = new int[3];
d[0] = aa;
d[1] = bb;
d[2] = cc;
int a, b, c;
for (int i = 0; i < d.length; i++) {
//实现列表循环,对循环列表取值
a = d[i];
b = d[ (i + 1) % d.length];
c = d[ (i + 2) % d.length];
if(a == b && b == c)
{
type = "equilateral triangle";//等边三角形
break;
}
else if(a==b)
{
if(a * a + b * b == c * c)
{
type = "isoceles and right-angled triangle"; //等腰直角三角形
}
else
type = "isoceles triangle"; //等腰三角形
break;
}
else if(a * a + b * b == c * c)
{
type = "right-angled triangle"; //直角三角形
}
}
}
else
type="failed to construct triangle";
return type;
}
可能你的理解有错,这个被检测的函数TrangleTest2是存在于一个Demo.java中的,在检测TrangleTest2之前,是没有知道TrangleTest2内部的if-else的结构的,现在是要求一边扫描TrangleTest2,一边用一个数据结构表示TrangleTest2内部的if-else的结构,要求:
1.给出这种数据结构2.给出遍历这种数据结构的算法框架。(至于如何找到Demo.java文件,以及如何在Demo.java中找到TrangleTest2,都可以不考虑)
检查{}配对,
碰到if后第一个(,将与之配对的)内所有东西作条件,
{}里面的所有String进入新的Parser,返回的ConditionalTree[](针对一系列if-else if)作为这个ContionalTree的subtrees,
同时,与这个if同级的else if一起构成上一级的ConditionalTree[]返回给更上一层的调用者,这样可能最上层是一个ConditionalTree[],或许可以强制给他一个if(true)的上层ContionalTree视之成为单根
public class ThreeTreeNode {
private String key; //结点关键字
public ThreeTreeNode left;
public ThreeTreeNode middle;
public ThreeTreeNode right;
public int layer; //结点所在的层数
…………………………
}二、三叉树逻辑定义
1、 根结点为空。
2、 结点的左孩子指向嵌套的if语句。
3、 结点的中孩子指向与之匹配的else if和else语句块
4、 结点的右孩子指向与之串行的if语句。
5、 叶子结点的左、中、右孩子均为空三叉树类数据结构:
public class ThreeTree {
public ThreeTreeNode root;
……………………………..
}
是我理解错了:)
原题是要扫描这个代码,而不是优化代码,来解决代码内部的问题。:P现在更正我的思路如下,敬请大家指教。1.使用一种变形的二叉树。
对于某个局部片段,如果只有if else结构,当前节点记录if else,并将当前节点标记为树。
分别定义为左子树(if 部分)和右子树(else部分)。
2.如果if else 后有与之串行的部分,则将串行部分分别定义为单独的树节点,
然后把这些节点连同前面的节点,一起定义为森林。
共同记录在树内。
3.如果分析到了最末端,如,只剩下一个s=" ... ",则将次部分记录为叶子节点。
请给出您所说的二叉树的结构定义如何?好像不是很清楚哦
private String valude;//该节点的值
private DataModel ifNode;//if节点
private DataModel elseNode;//else节点
//to add your code;
}算法框架就不写了,随便找本书都能找到例子。
public class TreeNode
{
//标记此节点的性质, public String ;}
应该是这样:
public class TreeNode
{
//标记此节点的性质
//0表示节点为二叉树 1表示此节点为森林 2表示此节点为叶子
public String nodeType;
//如果此节点为树,定义左子树,右子树,及其父亲。
public TreeNode left,right,parent;
//如果此节点为身林,定义身林内的兄弟
public TreeNode[] brothers;
//如果此节点为叶子,定义叶子内保存的节点数值
public String nodeValue;
}