递归查找Treeview节点

use*_*219 2 c#

我有以下树

A
+-B
+-C 
| +-D
+-E
  +-F
  +-G
Run Code Online (Sandbox Code Playgroud)

我试图找到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;
}
Run Code Online (Sandbox Code Playgroud)
FindTreeNode(root,C,null)
Run Code Online (Sandbox Code Playgroud)

因为CG例程找到C及其子女之前.如果if(child.HasChildren)它找到的else块C及其子节点.当我试图找到E它的孩子时,递归调用无法正常工作.它带有根节点,A但在它进入递归后,子节点变为C然后nodes.Nodes = 1

当我搜索FG它必须继续其递归.那么如何将子设置为根节点

Oli*_*bes 5

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

if (child.HasChildren)
{
    found = FindTreeNode(child, type, id);
    if (found != null) 
        break;
}
Run Code Online (Sandbox Code Playgroud)

你的方法看起来很复杂.这不就是这样吗?

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;
}
Run Code Online (Sandbox Code Playgroud)