递归查找Treeview节点

时间:2014-04-15 18:37:55

标签: c#

我有以下树

A
+-B
+-C 
| +-D
+-E
  +-F
  +-G

我正在尝试找到G A

private TreeListNode FindTreeNode(TreeListNode node, Enumerations.ItemType type,
                                  Nullable<long> id)
{
    TreeListNode found = null;
    foreach (TreeListNode child in node.Nodes)
    {
        if ((Enumerations.ItemType)child[2] == type)
        {
            if (id == null)
            {
                found = child;
                break;
            }
            else
            {
                if ((long)child[0] == (long)id)
                {
                    found = child;
                    break;
                }
            }
        }
        else
        {
            if (child.HasChildren)
            {
                found = FindTreeNode(child, type, id);
                break;
            }
        }
    }
    return found;
}

由于FindTreeNode(root,C,null) 位于C之前,所以routinue可用于查找G及其子项。 如果else块C找到if(child.HasChildren)及其子节点。 当我试图找到C及其子女时, 递归调用无法正常工作。 它带有根节点E,但在它进入递归后,子项变为A,然后C

当我搜索nodes.Nodes = 1F时,它必须继续递归。那么如何将子设置为根节点

1 个答案:

答案 0 :(得分:5)

即使递归调用没有找到任何内容,你也会收支平衡。将相关代码更改为:

if (child.HasChildren)
{
    found = FindTreeNode(child, type, id);
    if (found != null) 
        break;
}

你的方法看起来很复杂。不会这样做吗?

private TreeListNode FindTreeNode(TreeListNode node, Enumerations.ItemType type,
                                  Nullable<long> id)
{
    foreach (TreeListNode child in node.Nodes) {
        if ((Enumerations.ItemType)child[2] == type &&
            (id == null || (long)child[0] == id.Value)) {

            return child;
        }

        if (child.HasChildren) {
            TreeListNode found = FindTreeNode(child, type, id);
            if (found != null) {
                return found;
            }
        }
    }
    return null;
}