У меня есть этот код, чтобы найти диаметр двоичного дерева. Диаметр бинарного дерева: диаметр дерева (иногда называемый шириной) - это число узлов на самом длинном пути между двумя листьями в дереве.Рекурсия - Двоичное дерево
Я пытаюсь понять приведенный ниже код и рекурсию в целом. Я пытаюсь сушить пробег с этим простым деревом. Я понимаю, что когда root составляет 20, высота станет 1 (Max (0,0) +1), а затем вернет Math.Max (0 + 0 + 1, Max (0,0)). Мое понимание здесь - это установить ldiameter в 1 с этим возвращаемым значением, а root = 10. Правильно ли это? и в этот момент lh изменяется на 1. Как он изменяется на 1? Кроме того, если вы можете помочь мне сухим запустить это простое дерево шаг за шагом, это будет очень полезно.
10
/ \
20 30
public int FindDiameter_util(Node root, ref int height)
{
/* lh --> Height of left subtree
rh --> Height of right subtree */
int lh = 0, rh = 0;
/* ldiameter --> diameter of left subtree
rdiameter --> Diameter of right subtree */
int ldiameter = 0, rdiameter = 0;
if (root == null)
{
height = 0;
return 0; /* diameter is also 0 */
}
/* Get the heights of left and right subtrees in lh and rh
And store the returned values in ldiameter and ldiameter */
ldiameter = FindDiameter_util(root.left, ref lh);
rdiameter = FindDiameter_util(root.right, ref rh);
/* Height of current node is max of heights of left and
right subtrees plus 1*/
height = Math.Max(lh, rh) + 1;
return Math.Max(lh + rh + 1, Math.Max(ldiameter, rdiameter));
}
Мой совет вам: во-первых, избавиться от всех 'ref'. Поверните это в метод, который возвращает неизменяемую структуру, состоящую из двух целых чисел с именами Height и Diameter. Во-вторых, тот факт, что вы должны иметь комментарии, объясняющие имена переменных, означает, что они названы плохо. Они должны быть 'leftDiameter',' leftHeight' и т. Д. В-третьих, напишите алгоритм так, чтобы каждая переменная записывалась только один раз. Когда вы это сделаете, код будет намного легче понять. –
Вы правы, используя ref's, что заставило меня запутать. Спасибо за другие предложения. – Kar