日期:2014-05-18  浏览次数:20902 次

高分求助啊,算法啊,这种结构如何排序呢?
原结构:
假设根节点为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个下层吗?
------解决方案--------------------
探讨
这格式变了,看这个图片吧:
<br/>
<br/>

------解决方案--------------------
此外,第7个和第4个如何安排?等到第7个下放之后再处理下层呢?还是第4个就先处理了,等到第7个到来再重新处理一次?

按示例中的变化,看不出这些处理方式来。
------解决方案--------------------
看不懂~~~~~
------解决方案--------------------
树是用什么存的?需要代码?
------解决方案--------------------
比如root的子节点有超过六个了,应该怎么移动?
------解决方案--------------------
XML
假设节点都有一个本层的index(从0开始)。

递归方法(Root节点)
{
将本层所有子节点设置属性index(从0开始)
if 本层子节点个数 > 3
{
遍历index>2的节点向第 index %3 子节点 追加 该节点
}
foreach(节点 in 所有子节点)
{
递归方法(节点)
}
}


------解决方案--------------------
和我理解有点不一样。。。。



探讨

如果root子节点超过六人, 这样移
root
r1
r4
r5
r6
r2
r3

------解决方案--------------------
探讨

如果root子节点超过六人, 这样移
root
r1
r4
r5
r6
r2
r3

------解决方案--------------------
比如W7,没被放在WA的下面,而是放到了WB的下面。
------解决方案--------------------
这个和我的理解是一样的。。

探讨

引用:

root
1
4
2
5
3
6

------解决方案--------------------
探讨

这个和我的理解是一样的。。

引用:

引用:

root
1
4
2
5
3
6

------解决方案--------------------
的确缺少条件没有办法写啊。。。。。。
------解决方案--------------------
递归吧。遍历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;  //  摘下需要下挂的