Почтовый обход дерева - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь сделать пост-почтовый обход дерева.Узлы дерева имеют данные типа int и 2 указателя: один слева и один справа.У меня есть функция, которая дает мне голову дерева.Что я делаю: я создаю временный узел и устанавливаю его в качестве главы.То, что я хочу сделать, это итерация к дереву, пока этот темп не станет nullptr.Таким образом, в каждой итерации я проверяю, есть ли правый или левый указатель на узел, и соответственно устанавливаю темп.Если узел не имеет левого или правого указателей, я получаю значение узла и добавляю его в вектор.Затем мне нужно удалить этот узел (и вот в чем проблема) и снова сделать временный указатель на корень дерева.Моя проблема в том, что я не могу удалить последний узел.Вот мой код.

void postOrder(Node* root)
{
    vector<int> result;
    Node* tmp = nullptr;
    tmp = root;
    int val = 0;

    while ((tmp != nullptr)) {

        if (tmp->left != nullptr) {
            tmp = tmp->left;
        }
        else if (tmp->right != nullptr) {
            tmp = tmp->right;
        }
        else {
            val = tmp->data;
            cout << val;
            result.push_back(val);
            *tmp = NULL;
            tmp = root;
        }
    }
    for (auto& e : result)
        cout << e << " ";
}

Я пытаюсь установить в null то, на что указывает этот временный указатель, а затем снова установить его на голову, но это не сработало;

1 Ответ

0 голосов
/ 22 июня 2019

Указатель содержит адрес памяти другой переменной.Это означает, что когда вы делаете * tmp = null, это означает, что теперь он указывает на нольЭто не означает, что вы изменили значение его родительского левого или правого дочернего элемента на NULL.

Кстати, также возможен обход после заказа.Вы должны следить за родителем последнего элемента.Но это будет так много времени.Посмотрите:

void postOrder(Node* root)
{
    vector<int> result;
    Node  *tmp = nullptr;
    tmp = root;
    int val = 0;

    Node *prv=root;
    while ((tmp != nullptr))
    {

        if (tmp->left != nullptr) {
            prv=tmp;
            tmp = tmp->left;

        }
        else if (tmp->right != nullptr) {
            prv=tmp;
            tmp = tmp->right;
        }
        else {
            val = tmp->data;
            cout << val;
            result.push_back(val);
            if(tmp==root)root=NULL;
            if(prv->left!=NULL)prv->left=NULL;
            else prv->right=NULL;
            tmp = root;
        }
    }
    for (auto& e : result)
        cout << e << " ";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...