2013-07-03 6 views
6

Я несколько смущен между логикой вычисления высоты двоичного дерева.Confused - Высота двоичного дерева

Код 1

public static int findHeight(Tree node) { 
    if(node == null) 
     return 0; 
    else { 
     return 1+Math.max(findHeight(node.left), findHeight(node.right)); 
    } 

} 

Код 2

public static int findHeight(Tree node) { 
    if(node == null) 
     return -1; 
    else { 
     return 1+Math.max(findHeight(node.left), findHeight(node.right)); 
    } 

} 

Я думаю, второй является правильным, так как он дает правильный ответ на код ниже: -

Tree t4 = new Tree(4); 
Tree t2 = new Tree(2); 
Tree t1 = new Tree(1); 
Tree t3 = new Tree(3); 
Tree t5 = new Tree(5); 

t4.left = t2; 
t4.right = t5; 

t2.left = t1; 
t2.right = t3; 

// Prints "Height : 2" for Code 2 
// Prints "Height : 3" for Code 1 
System.out.println("Height : " + findHeight(t4)); 

Я confus ред, потому что многие из других SO ответов показывает логику для вычисления высоты в соответствии с Кодексом 1

Противоречивые логик


UPDATE:

All , У меня есть основное сомнение относительно того, что точно высотой дерева?

1. Не является ли это узлом между корнем и самым глубоким узлом дерева (включая оба - корень & самый глубокий узел)?

2. Разве это не ребро между корнем и самым глубоким узлом дерева?

ИЛИ

3. Является ли это просто вопрос реализации каждого человека - Оба подхода являются правильными?

+0

Но нет никаких вопросов .. – Maroun

+0

Проверьте обновление! – tmgr

+0

Это совершенно произвольное определение. Вы хотите, чтобы высота была числом ребер или количеством узлов? Пока вы согласны, все будет работать. – Teepeemm

ответ

5

разница все лежит, если пустое дерево имеет высоту -1 или 0.

Согласно Wikipedia :

Высота узла - это длина самого длинного нисходящего пути к листу от этого узла. Высота корня - высота дерева. Глубина узла - это длина пути к его корню (т. Е. Его корневой путь).

и

корневой узел имеет глубину ноль, листовые узлы имеют нулевую высоту, и дерево только с одним узлом (отсюда и корень и лист) имеет глубину и высоту нулевой. Обычно пустое дерево (дерево без узлов, если таковые разрешены) имеет глубину и высоту -1.

Таким образом, вы можете быть правы - второй согласен с этим.

Конечно, все эти определения - я не был бы слишком удивлен, увидев определение, согласующееся с первой версией.

+0

Проверьте мое обновление! – tmgr

+0

Длина пути - это количество краев, поэтому я бы сказал 2. –

+0

Но, согласно коду 1, о котором многие пользователи SO говорят (включая Jon Skeet) http://stackoverflow.com/q/5763854/2546848 , что приведет к неправильному ответу на мой код выше. Разве это не так? – tmgr

0

Ваш пример высоты 3 (t4 - корень, t4.left - t2, t2.left is t1), если ваше понимание высоты (1 корневой узел имеет высоту 1, корневой узел с дочерним или два имеет высоту 2, и т.д.)

t4.left = t2; 
t4.right = t5; 

t2.left = t1; 
t2.right = t3; 

Так код 1 является правильным :))

+0

Проверьте мое обновление! – tmgr

+0

Второй - это правда, но для многих ситуаций разработчики идут с первым при реализации высоты. Итак, ответ 3 :)) – Tala

0

Код 0 будет считать корень высотой 1 (корень должен быть 0). Это означает, что все последующие деревья будут слишком большим.

Смежные вопросы