Предзаказ бинарного дерева

Мой метод предзаказа не работает из основного, но элемент массива сформировался правильно (я проверял печатью каждый шаг). Все функции/методы, использованные в определении, работают корректно. Я думаю, что проблема возникает из-за элемента возврата строки;. Кто-нибудь может предложить любую идею, это слишком важно.

T* TreeNode<T>::preorder()const 
{
    T* elem = new T[elCount(left)+elCount(right)+1];
    elem[0] = data;
    TreeNode<T>* curr = left;
    Stack<TreeNode<T>*> st;
    if (right) {
        st.push(right);
    }
    int i = 1;
    while (curr) {
        elem[i++] = curr->getData();
        //std::cout << elem[i - 1];
        
        if (curr->getRight()) 
            st.push(curr->getRight());
        
        curr = curr->getLeft();
        if (!curr) 
        {
            curr = st.getTop();
            st.pop();
        }   }
    return elem;
}

person Ani Tovmasyan    schedule 12.11.2020    source источник
comment
Показанный код этого вопроса не соответствует требованиям stackoverflow.com для минимально воспроизводимого примера. Это означает, что маловероятно, что кто-то здесь сможет окончательно ответить на вопрос; но только догадываться в лучшем случае. Вы должны отредактировать свой вопрос, чтобы показать минимальный пример, не более одной или двух страниц кода (минимальная часть), чтобы все остальные могли вырезать/вставить, скомпилировать, запустить и воспроизвести описанную проблему (воспроизводимую часть) точно так, как показано (включая любую вспомогательную информацию, такую ​​как входные данные для программа). Дополнительную информацию см. в разделе Как спросить.   -  person Sam Varshavchik    schedule 12.11.2020
comment
Как вы определяете, что он не работает? (Кроме того, std::vector — ваш друг.)   -  person molbdnilo    schedule 12.11.2020
comment
Если бы я получал доллар каждый раз, когда кто-то (включая меня) говорит, что все эти другие функции работают правильно, значит, проблема должна быть здесь, но оказывается, что это не так, я был бы немного богаче. Однако return elem; определенно не является источником ваших проблем.   -  person molbdnilo    schedule 12.11.2020
comment
@SamVarshavchik Спасибо за совет. приму к сведению.   -  person Ani Tovmasyan    schedule 12.11.2020


Ответы (1)


Немного сложно понять, что именно вы пытаетесь сделать, поскольку это не указано, но кажется, что вы пытаетесь получить все данные из своего двоичного дерева. Эта статья GFG дает действительно простое объяснение и разбивку как пересечь бинарное дерево. Очевидно, ваши узлы сложнее, но общая логика та же. Я бы спросил себя, действительно ли функция preorder() должна быть частью класса узла дерева и не будет ли отдельная функция немного более полезной. Я бы также подумал об использовании std::vector, а не несущей, которую вы сейчас используете. Если вам нужен фиксированный размер, std::array, вероятно, также подойдет лучше.

Чтобы показать, как вы могли бы переписать свой код, вы можете попробовать что-то вроде

std::vector<int> vect;

template<class T>
void preorder(const TreeNode<T>& node, vector<T>& elem) {
    if(!node.getData()) {
        return;
    }

    elem.push(node.getData());

    if(node.getLeft()) {
        preorder(node.getLeft());
    }

    if(node.getRight()) {
        preorder(node.getRight());
    }
}

Это не идеально, поскольку я написал это навскидку, но это должно обеспечить простую основу для обхода двоичного дерева и извлечения всех данных. Немного рекурсии должно сделать это намного проще.

person Gabe Ron    schedule 12.11.2020