Я должен создать двоичное дерево, в котором узлы хранят значение char. Задача состоит в том, чтобы найти самый большой лексикографически путь от корня к листу, созданный этими символами.
Заданный вход должен быть строкой, где первый символ — это значение для хранения, а после пробела есть подсказки, в каком узле он хранится. L означает левый узел, р конечно верно один.
Выходными данными должны быть найденная строка и количество символов, указанных во входных данных (не пробелы).
Это мой код Я почти уверен, что ошибка в rootToLeafPath (), потому что я уже проверил метод, который создает дерево. Я также даю вам метод печати, если вы хотите увидеть все пути.
#include <stdio.h>
#include <iostream>
#include <string.h>
int allCharCounter = 0;
char oldest_word[65];
struct Tree_node{
struct Tree_node *right;
struct Tree_node *left;
char value;
};
Tree_node* getTree(struct Tree_node* root){
char c = getchar();
char edge = c;
Tree_node* korzen = new Tree_node();
if(root == NULL){
root = new Tree_node();
}
korzen = root;
while(!feof(stdin)){
c = getchar();
if(c == 82){//R
allCharCounter++;
if(root->right == NULL){
root->right = new Tree_node();
}
root = root->right;
}else if(c == 76){//L
allCharCounter++;
if(root->left == NULL){
root->left = new Tree_node();
}
root = root->left;
}else if(c > 96 && c < 123){
allCharCounter++;
root->value = edge;
root = korzen;
edge = c;
}
}
root->value = edge;
root = korzen;
return root;
}
void printPath(char *path, int length){
int i;
for(i = 0; i <= length; i++){
printf("%c ", path[i]);
}
printf("\n");
}
void rootToLeafPath(struct Tree_node *nodeptr, char *current_path, int index){
if(nodeptr != NULL){
current_path[index] = nodeptr->value;
if(nodeptr->left == NULL && nodeptr->right == NULL){
if(strcmp(oldest_word,current_path)< 0){
//memset(oldest_word,0,sizeof(oldest_word));
strncpy(oldest_word, current_path, 65);
}
//printPath(current_path, index);
}
rootToLeafPath(nodeptr->left, current_path,index+1);
rootToLeafPath(nodeptr->right, current_path,index+1);
}
}int main(){
struct Tree_node* root = NULL;
struct Tree_node* test = NULL;
root = getTree(root);
char current_path [65] ={};
rootToLeafPath(root, current_path,0);
std::cout<< oldest_word;
fprintf(stdout,"\n%d", allCharCounter+1); //-> ok
}
Итак, для ввода:
с LR
z LRR
м р.р.
р LRLRL
К
с LRL
все
т л
ч р
j LRLR
LRRR
Выход должен быть:
ktsza
38
Но мой код создает:
ktszap
38
Я подумал, что, возможно, мне нужно очистить old_word, прежде чем дать ему новое значение, но не сработало. Для меня это выглядит так, как будто он запоминает более длинное значение, которое было раньше. В этом примере слово «ktswjp» раньше было словом в массиве, но затем было найдено новое слово «ktsza», но «p» остался.
Ценю любую помощь.
В rootToLeafPath
Вы назначаете значение current_path[index] = nodeptr->value;
сохранить следующий символ. Когда вы закончите с этим символом, вы не очистите его, поэтому он останется в буфере, в результате чего он появится в конце строки, которая должна быть короче.
Решение состоит в том, чтобы сбросить его до нулевого символа, прежде чем вернуться, с
current_path[index] = '\0';
после ваших рекурсивных звонков rootToLeafPath
сделано.
Других решений пока нет …