2014-12-10 3 views
1

У меня есть древовидная структура, где каждый узел может иметь практически неограниченные дети, он моделирует комментарии для блога.Как найти глубину/уровень узла в небиновом дереве?

Я пытаюсь выяснить, учитывая идентификатор конкретного комментария, на какой глубине/уровне этот комментарий лежит в дереве.

Я следовал this guide that explains it for binary trees, но при адаптации его к недвоичным деревьям у меня проблемы.

Вот моя попытка до сих пор (в Swift):

func commentLevelRecursive(comment: Comment, commentID: String, currentLevel: Int) -> Int { 
    if comment.identifier == commentID { 
     return currentLevel 
    } 

    var newLevel = currentLevel 

    for reply in comment.replies { 
     newLevel = commentLevelRecursive(reply, commentID: commentID, currentLevel: currentLevel + 1) 
    } 

    return newLevel 
} 

Но это всегда казалось бы, возвращает 1. Я думаю, что это происходит потому, что newLevel всегда получает увеличилось с 0 до 1, то возвращается.

Может ли кто-нибудь дать мне некоторое представление о том, где я ошибаюсь?

+1

newLevel = макс (newLevel, commentLevelRecursive (ответ, CommentID: CommentID, currentLevel: currentLevel + 1)) – Mark

+0

@IonescuRobert Зачем использовать макс? Есть только одно вхождение узла с этим идентификатором. –

+0

Да, но вы собираетесь пройти несколько ответов, поэтому вам нужна максимальная глубина от всех них. «newLevel» в этом случае будет для каждого уровня максимальной глубиной для его детей. Таким образом, вы будете иметь на первом узле максимальную глубину, если будете следовать этому правилу. – Mark

ответ

1

Двоичное дерево - особый случай, когда каждый узел имеет только двух детей. Метод, используемый для определения уровня узла, может быть распространен на общее дерево.

Идея та же:

level(P) = max(level(C) for each child node C of P)+1 
+0

Как бы эта работа в мой код? Или требуется переработка с нуля? –

+0

И разве это не для поиска максимальной глубины дерева? –

0
int MaxDepth(int x,int parent){ 
    int mx = 0; 
    for(int i = 0;i < graph[x].size();i++) 
     if(graph[x][i]!=parent){ 
      mx = max(MaxDepth(graph[x][i],x),mx); 
     } 
     return mx + 1; 
}