Получить следующий элемент в дереве - PullRequest
6 голосов
/ 14 апреля 2011

Наличие дерева (логического в БД) с элементами в форме

  1. Элемент списка A
  2. Элемент списка B
    1. Элемент списка C
      1. Элемент списка D
  3. Элемент списка E
  4. Элемент списка F
    1. Элемент списка G

и т. Д. (Глубина вложения не ограничена), я хочу отключить (или увеличить) следующий узел, начиная с произвольного узла.

Допустим, List Item D дано, я хочу написать функцию GetNextNode(), которая будет возвращать List Item E.

Моя идея состоит в том, чтобы заняться рекурсией, но, может быть, есть более умный способ справиться с этим?

Мой вопрос:

Как бы вы решили это?

РЕДАКТИРОВАТЬ 1:

Доступ к дереву можно получить с помощью таких функций, как:

  • GetParentNode()
  • GetChildrenNodes()
  • GetNextSiblingNode()
  • и т.д.

Так что это похоже, например, Windows Forms TreeView.

Ответы [ 5 ]

5 голосов
/ 14 апреля 2011

Я должен был сделать это несколько раз. По памяти:

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 голос
/ 21 января 2013
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;
    }
}
1 голос
/ 14 апреля 2011

Вы можете справиться с этим с помощью рекурсии или ... худшего 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 "";
}

Это не работает для каждого сценария. Вы должны искать следующий узел родителя тоже. Спасибо Винсенту Ванкалбергу за комментарий; -)

0 голосов
/ 14 апреля 2011

Поскольку я получил отличный ответ для части «вниз», я добавил свою собственную часть «вверх». Может быть, это для какой-то помощи вам; верхняя часть похожа на:

  1. Получить предыдущего брата.
  2. Если там есть предыдущий брат, получите самый глубокий дочерний узел этого брат или сестра.
  3. Если есть нет предыдущего родного брата, получите прямого родителя.

Чтобы получить самого глубокого брата (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; на самом деле он мне нужен на этом языке)

0 голосов
/ 14 апреля 2011

Попробуйте это может быть:

TreeNode currentNode = treeView1.SelectedNode;
treeView1.selectedNode = currentNode.NextNode;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...