I Предположим, вы имеете в виду заполнение значения глубины на узле и/или определение максимальной глубины. Один из способов сделать это - использовать два списка и сделать порядок уровней, как было предложено. Это было бы сродни:
int level=0;
List<Node> currentLevel = new List<Node>{root};
while(currentLevel.Count != 0)
{
List<Node> nextLevel = new List<Node>{};
foreach(Node node in currentLevel)
{
if(node.Right!=null) nextLevel.Add(node.Right);
if(node.Left != null) nextLevel.Add(node.Left);
node.Depth=level;
}
level++;
currentLevel=nextLevel;
}
В принципе, вы перечислить каждый узел на заданном уровне, а затем найти каждый узел на следующем уровне; пока не закончите узлы/уровни. Очевидно, что List можно заменить практически любым списком, например структурой данных (Linked List, Queue и т. Д.). И последнее значение «уровня» будет максимальной глубиной + 1. Я подозреваю.
Еще одно разъяснение, основанное на повторном рассмотрении вопроса; если вы ищете узел с определенным значением и хотите найти его глубину, вы должны изменить цикл foreach, чтобы включить «if (node.Value == searchValue) уровень возврата;». И, технически, если вы ищете определенное значение, вам не следует делать обход порядка порядка, а скорее поиск значения с использованием соответствующих свойств двоичного дерева (например, val < currentNode.Value goto left else goto right), и отслеживание вашей глубины. Если вам задан только узел и вы хотите найти его глубину, вам нужно либо выполнить двоичный поиск узла из корня, либо вам нужно будет отслеживать родительский узел.
Рекурсия должна быть самым простым способом сделать это, почему вы хотите ее избежать? – Kirschstein
Является ли поле глубины расстоянием от корня или от самого дальнего ребенка? –
Kirschstein: Есть причины избежать рекурсивных вызовов на платформах с ограниченными ресурсами (например, встроенные системы). Часто необходим нерекурсивный алгоритм с постоянной печатью в памяти. –