Обзор кода: это самый эффективный / элегантный способ рекурсивного обхода дерева

Это более общий вопрос, поэтому ответ не обязательно должен быть в C#. Ниже приведена общая структура кода, которую я использую для рекурсивного обхода древовидной структуры. В этом конкретном случае я добавляю к объекту строителя строки в каждой итерации.

Есть ли способ улучшить этот код, чтобы быть быстрее или лучше?

    public static void RecursiveFunction(StringBuilder sb, Object treeObject)
    {
        sb.Append(treeObject.GetCurrentValue("Name"));

        if (treeObject.MoveToFirstChild())
        {
            RecursiveFunction(sb, treeObject);
        }

        if (treeObject.MoveToNextSibling())
        {
            RecursiveFunction(sb, treeObject);
        }

        if (treeObject.MoveToParent()) 
        {
            if (treeObject.MoveToNextSibling())
            {
                RecursiveFunction(sb, treeObject);
            }
        }        

        return;
    }

Благодарю.

3 ответа

Решение

Я бы наверное сделал

public static void RecursiveFunction(StringBuilder sb, Object treeObject) {
    sb.Append(treeObject.GetCurrentValue("Name"));
    if (treeObject.MoveToFirstChild()) {
        do {
            RecursiveFunction(sb, treeObject);
        } while (treeObject.MoveToNextSiblin());
        treeObject.MoveToParent();
    }
}
void RecurseTree(StringBuilder sb, Object tree)
{
    foreach (var child in tree.Children)
    {
        sb.Append(child.Name);
        if (child.Children.Count > 0)
        {
            RecurseTree(sb, child);
        }
    }
}

Я думаю, что эта часть должна быть избыточной:

if (treeObject.MoveToParent()) 
    {
        if (treeObject.MoveToNextSibling())
        {
            RecursiveFunction(sb, treeObject);
        }
    }

Рекурсия должна позаботиться об этом за вас.

Другие вопросы по тегам