Азбука Морзе - бинарное дерево
Как определяется буква азбуки Морзе?
"E" = "." "Т" = "-"
Почему это не алфавитный? Как в let "A" = ".", "B" = "-", "C" =".-" и т. Д.
Я пытаюсь разработать алгоритм обхода двоичного дерева, заполненного этим письмом.
Моя главная цель - найти букву, например "А", но я не знаю, какие условия использовать, чтобы определить, когда перейти к правому или левому узлу.
РЕДАКТИРОВАТЬ
Это то, что я пытался сделать. Здесь я пытаюсь отследить путь. Но когда я пробую это с буквой типа "E", он говорит, что корень пуст.
static boolean treeContains( Node root, String item ) {
// Return true if item is one of the items in the binary
// sort tree to which node points. Return false if not.
if ( root == null ) {
// Tree is empty, so it certainly doesn't contain item.
System.out.print("Is null");
return false;
}
else if ( item.equals(root.element) ) {
// Yes, the item has been found in the root node.
return true;
}
else if ( item.compareTo(root.element) < 0 ) {
// If the item occurs, it must be in the left subtree.
// So, return the result of searching the left subtree.
res = res.concat(".");
return treeContains( root.right, item );
}
else {
// If the item occurs, it must be in the right subtree.
// So, return the result of searching the right subtree.
res = res.concat("-");
return treeContains( root.left, item );
}
} // end treeContains()
1 ответ
Если у вас есть двоичное дерево с буквами, то пусть слева будет точка (.), А справа - тире (-). Когда вы обойдете дерево, вы будете знать, каким будет двоичный код для каждой буквы, отслеживая путь.
РЕДАКТИРОВАТЬ
Глядя на свой код, вы неправильно обходите дерево. Во-первых, я не уверен, что переменная res
есть, но я держу пари, что это статичный, что не является хорошей практикой кодирования.
Ваша настоящая проблема в том, что ваше сравнение item.compareTo(root.element) < 0
недопустимое сравнение для этого дерева. Вместо этого вы должны использовать рекурсивный вызов в качестве теста, treeContains( root.right, item )
, Только если это вернет true, вы можете добавить точку (.) К вашему res
строка. Если он возвращает false, то вы можете сделать рекурсивный вызов, используя root.left
и добавить тире (-).
Лично я бы вернул строку из этого метода. Строка будет кодом Морзе для буквы до сих пор, или ноль, если буква не найдена. Когда вы вернетесь назад от правильного обхода дерева, создайте правильную строку (то, что вы сейчас используете для res).
Что нужно проверить, так это то, что вам может потребоваться выполнить конкат в начале строки, а не в конце строки, чтобы все получилось правильно.
Настоящая полезность этого дерева заключается в декодировании азбуки Морзе, преобразовании строки из тире-тире в правильную букву. Это становится простым обходом дерева.