不怕错,就怕曾经对而现在错。昨天关机前还用的好好的算法,今早起来就出了问题(代码没改,机器系统不变)
请大家帮我看下这个TreeView遍历算法有什么隐患?该算法特点是没有用到Stack public static bool traverse(TreeNodeCollection node, RichTextBox edit)
{
if ((node == null) || (node.Count == 0))
{
return false;
} TreeNode temp = node[0]; edit.Text = ""; while (temp != null)
{
while (temp.Nodes.Count > 0)
{
temp = temp.Nodes[0];
} edit.Text += temp.Text;
edit.Text += "\r\n"; if (temp.NextNode != null)
{
temp = temp.NextNode;
}
else
{
temp = temp.Parent;
if (temp == null)
{ break; } edit.Text += temp.Text;
edit.Text += "\r\n"; temp = temp.NextNode;
} }//end while return true;
}//end fun
请大家帮我看下这个TreeView遍历算法有什么隐患?该算法特点是没有用到Stack public static bool traverse(TreeNodeCollection node, RichTextBox edit)
{
if ((node == null) || (node.Count == 0))
{
return false;
} TreeNode temp = node[0]; edit.Text = ""; while (temp != null)
{
while (temp.Nodes.Count > 0)
{
temp = temp.Nodes[0];
} edit.Text += temp.Text;
edit.Text += "\r\n"; if (temp.NextNode != null)
{
temp = temp.NextNode;
}
else
{
temp = temp.Parent;
if (temp == null)
{ break; } edit.Text += temp.Text;
edit.Text += "\r\n"; temp = temp.NextNode;
} }//end while return true;
}//end fun
A
-A1
-A11
-A2
-A21
B
-B1
-B11当你遍历到A21时(即temp=A21,),执行下面代码[align=left]temp = temp.Parent;
if (temp == null)
{ break; } edit.Text += temp.Text;
edit.Text += "\r\n"; temp = temp.NextNode; [/align]
当执行“temp = temp.Parent;” 时temp值变为A2,
然后执行“ temp = temp.NextNode;”,这时候temp值(也就是A2.NextNode)为null;按常理这时应该返回到A2.Parent再去遍历,但是你没有返回到A2的Parent。
按你的代码执行结果就是:
A11
A1
A21
A2
连根节点A都没有遍历到。你这个只能遍历A的所有子节点。
建议用递归算法,或者如你所说用堆栈来遍历。
{
temp = temp.Nodes[0];
} 当某个中间层次有多个节点时只会处理第一个节点。修改的方法...好象除了递归,没有更合适的方法了。:-)不知道说的对不对。