递归查找树视图节点

本文关键字:节点 视图 查找 递归 | 更新日期: 2023-09-27 17:58:23

我有以下树

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

我正试图找到给定AG

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位于G之前,因此路由用于查找C及其子级。如果其它块CCD_ 6,则它找到CCD_。当我试图找到CCD_ 8及其子代时,递归调用工作不正常。它与根节点A一起进入,但在它进入递归后,子节点变成C,然后是nodes.Nodes = 1

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

递归查找树视图节点

即使递归调用没有找到任何内容,也可以实现盈亏平衡。将相关代码更改为:

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;
}