高分求助啊,算法啊,这种结构如何排序呢?
原结构:
假设根节点为ROOT
其树结构为
ROOT
WA
WAA
WAB
WB
WBA
H
HA
HAA
HAB
HAC
HB
HC
HD
H8
L
LA
LB
LC
LD
W7
目标结构为:
ROOT
WA
L
LA
LD
LB
LC
WAA
WAB
WB
W7
WBA
H
HA
HD
HAC
HAA
HAB
HB
H8
HC
原则是 读取目标节点的3个子节点,如果目标节点的子节点多余3个,则将该节点移到下一层节点
[解决办法]
有些困哦,期待有高手相助~!
[解决办法]
只能期待了。。。学习
[解决办法]
没太明白:如果本层有4个节点,那就把第4个放到第1个的下层去;如果有5个,那就把第5个放到第2个的下层。那么,当本层有7个的时候,第7个怎么处理?又重复放到第1个下层吗?
[解决办法]
[解决办法]
此外,第7个和第4个如何安排?等到第7个下放之后再处理下层呢?还是第4个就先处理了,等到第7个到来再重新处理一次?
按示例中的变化,看不出这些处理方式来。
[解决办法]
看不懂~~~~~
[解决办法]
树是用什么存的?需要代码?
[解决办法]
比如root的子节点有超过六个了,应该怎么移动?
[解决办法]
XML
假设节点都有一个本层的index(从0开始)。
递归方法(Root节点)
{
将本层所有子节点设置属性index(从0开始)
if 本层子节点个数 > 3
{
遍历index>2的节点向第 index %3 子节点 追加 该节点
}
foreach(节点 in 所有子节点)
{
递归方法(节点)
}
}
[解决办法]
和我理解有点不一样。。。。
[解决办法]
[解决办法]
比如W7,没被放在WA的下面,而是放到了WB的下面。
[解决办法]
这个和我的理解是一样的。。
[解决办法]
[解决办法]
的确缺少条件没有办法写啊。。。。。。
[解决办法]
递归吧。遍历wa,wb,h,l,w7完把l加到wa的子层,w7加到wb的子层
[解决办法]
看不出规律啊,这样的时间复杂度什么的难搞啊!
[解决办法]
仔细想了想,觉得其实两种处理方式是差不多的。下面的算法先下挂子节点,最后统一递归处理。运行效率要比下挂一个就处理一个更高些。
- C# code
class node { private string name; private node son; private node brother; public void Sort() { node[] p = new node[3]; // 节点数组,用于暂存3个子节点 node q,r=null; int i = 0; q = this.son; while (q != null && i < 3) // 若当前节点有子节点,则循环给数组赋值 { p[i] = q; i++; r = q; q = q.brother; } // 循环结束后,q指向第4子节点(存在的话),同时r指向第3子节点 // 若不存在第4节点,则q为null,r指向最后子节点。 i = 0; while (q != null) // 若还有未处理的子节点,则进行处理 { r.brother = q.brother; // 摘下需要下挂的节点 q.brother = p[i].son; // 挂入指定的节点下 p[i].son = q; q = r.brother; // 移动到下一节点 i = ++i % 3; } r.brother = null; for (i = 0; i < 3; i++) // 递归处理所有子节点 { if (p[i] != null) p[i].Sort(); else break; } } }
[解决办法]
上面的算法里有个bug:
当前节点没有子节点时r.brother=null;会出错。
解决的方法是在第一个循环前插入一句:
if (q=null) return;
[解决办法]
能不能结贴的时候把怎么处理的大致思路写上,让大家做个参考