获取树中的下一个项目

时间:2011-04-14 09:26:33

标签: c# recursion tree

在树中(逻辑上为DB)包含

形式的项目
  
      
  1. 列出项目A
  2.   
  3. 列出项目B.      
        
    1. 列出项目C.      
          
      1. 列出项目D
      2.   
    2.   
  4.   
  5. 列出项目E
  6.   
  7. 列出项目F.      
        
    1. 列出项目G
    2.   
  8.   

等等(嵌套深度不受限制),我希望从任意节点开始向下(或向上)获取下一个节点。

让我们说List Item D,我想写一个函数GetNextNode(),它将返回List Item E

我的想法是做一些递归的东西,但也许有一种更聪明的方法来处理它?<​​/ p>

我的问题:

你会如何解决这个问题?

编辑1:

可以使用以下函数访问树:

  • GetParentNode()
  • GetChildrenNodes()
  • GetNextSiblingNode()

所以它类似于例如e Windows窗体TreeView

5 个答案:

答案 0 :(得分:5)

我必须多次这样做。来自记忆:

public Node GetBelowNode()
{
    if (GetChildrenNodes().count > 0)
        return GetChildrenNodes()[0];
    else
        if (GetNextSiblingNode() != null)
            return GetNextSiblingNode();
        else
        {
            Node curr = this;
            Node parent; 
            while (true)
            {
                parent = curr.GetParentNode();
                if (parent == null)
                    return null;
                else
                {
                    if (parent.GetNextSiblingNode() != null)
                        return parent.GetNextSiblingNode();
                    else
                        curr = parent;
                }
            }
        }
}

答案 1 :(得分:1)

您可以通过递归或...最差xD

来处理此问题

我认为只有3个基本案例:

private string getNext(TreeNode node)
{
    if (node.FirstNode != null)
    {
        return node.FirstNode.Name;
    }
    else
    {
        if (node.NextNode != null)
        {
            return node.NextNode.Name;
        }
        else if (node.Parent.NextNode != null)
        {
            return node.Parent.NextNode.Name;
        }
    }

    return "";
}

这不适用于所有情况。您也应该搜索父节点的下一个节点。感谢Vincent Vancalbergh的评论; - )

答案 2 :(得分:1)

public Party Next {
    get {
        if (this.children.Count > 0) return this.children[0];

        Party target = this;
        do {
            if (target.NextSibling != null) return target.NextSibling;
        } while ((target = target.Parent) != null);

        return null;
    }
}

public Party Previous {
    get {
        if (Parent != null && Parent.children.Count > 0 && this == Parent.children[0]) {
            return Parent;
        }

        Party target = this;

        do {
            if (target.PreviousSibling != null) { target = target.PreviousSibling; break; }
        } while ((target = target.Parent) != null);

        if (target != null) {
            while (target.children.Count > 0) {
                target = target.children[target.children.Count - 1];
            }
        }

        return target;
    }
}

答案 3 :(得分:0)

尝试这个:

TreeNode currentNode = treeView1.SelectedNode;
treeView1.selectedNode = currentNode.NextNode;

答案 4 :(得分:0)

由于我对“向下”部分得到了很好的回复,我将添加自己的“向上”部分。也许这是为了你的一些帮助;上部类似于:

  
      
  1. 获取上一个兄弟姐妹。
  2.   
  3. 如果以前的兄弟,请获取此最深的子节点   兄弟节点。
  4.   
  5. 如果没有以前的兄弟姐妹,请获取直接父母。
  6.   

为了获得最深的兄弟(2.),我使用以下代码:

function getDeepestChild( page )
    dim result
    set result = nothing

    dim childPages
    set childPages = page.ChildPages

    if childPages.Count>0 then
        dim p
        set p = childPages(childPages.Count-1)
        ' recurse.
        set result = getDeepestChild( p )
    else
        set result = page
    end if

    set getDeepestChild = result
end function

(是的,我知道这是VBScript;我实际上用这种语言需要它)