Найдите самый большой лексикографически путь от корня до листа в двоичном дереве

Мне нужно создать двоичное дерево, в котором узлы хранят значение char. Задача состоит в том, чтобы найти самый большой лексикографически путь от корня до листа, созданный этими символами.

Данным вводом должна быть строка, где первый символ — это значение для хранения, а после пробела — подсказки, в каком узле оно хранится. L означает левый узел, R конечно правый. На выходе должна быть найденная строка и количество символов, заданное на входе (не пробелы).

Это мой код. Я почти уверен, что ошибка в 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
}

Итак, для ввода:

s LR

г ЛРР

m RR

р LRLRL

k

w ЛРЛ

a LL

t L

h R

j LRLR

LRRR

Вывод должен быть:

ктза

38

Но мой код создает:

ктзап

38

Я подумал, может быть, мне нужно очистить old_word, прежде чем присваивать ему новое значение, но это не сработало. Для меня это выглядит так, как будто он помнит более длинное значение, которое было раньше. В этом примере «ktswjp» раньше было словом в массиве, но затем было найдено новое слово, которое было «ktsza», но «p» осталось.

Цените любую помощь.


person dominosam    schedule 16.12.2017    source источник


Ответы (1)


В rootToLeafPath вы присваиваете значение current_path[index] = nodeptr->value; для сохранения следующего символа. Когда вы закончили с этим символом, вы не очищаете его, поэтому он остается в буфере, в результате чего он появляется в конце строк, которые должны быть короче.

Решение состоит в том, чтобы сбросить его до нулевого символа, прежде чем вы вернетесь, с помощью

current_path[index] = '\0';

после того, как ваши рекурсивные вызовы rootToLeafPath будут выполнены.

person 1201ProgramAlarm    schedule 16.12.2017