读书人

高分啊算法啊这种结构怎么排序呢

发布时间: 2012-04-25 19:32:32 作者: rapoo

高分求助啊,算法啊,这种结构如何排序呢?
原结构:
假设根节点为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;  //  摘下需要下挂的节点                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;
[解决办法]
能不能结贴的时候把怎么处理的大致思路写上,让大家做个参考

探讨

谢谢各位了,自己处理完了

读书人网 >C#

热点推荐