Я предполагаю, что вы имеете в виду заполнение значения глубины на узле и / или определение максимальной глубины. Один из способов сделать это - использовать два списка и сделать порядок уровней, как было предложено. Это было бы сродни:
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), и отслеживание вашей глубины. Если вам задан только узел и вы хотите найти его глубину, вам нужно либо выполнить двоичный поиск узла из корня, либо вам нужно будет отслеживать родительский узел.