后遍历树

时间:2019-06-22 12:35:25

标签: c++ tree

我尝试对树进行发布后遍历。树的节点有一个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,然后再次将其设置为head,但这没有用;

1 个答案:

答案 0 :(得分:0)

指针保存另一个变量的内存地址。这意味着当您执行* tmp = null时,这意味着它现在指向null。这并不意味着您已将其父级左或右子级的值更改为NULL。

使用您的方法也可以遍历BTW后订单。您必须跟踪最后一个元素的父元素。但这将非常耗时。 看看:

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 << " ";
}