C++ 树的后序遍历

C++ 树的后序遍历,c++,tree,C++,Tree,我尝试对一棵树进行后序遍历。树的节点有一个int数据和两个指针,一个向左,一个向右。我有一个函数给我树的头。我所做的是: 我创建一个临时节点并将其设置为头部。而我要做的是迭代到树,直到这个临时值变为null ptr。因此,在每次迭代中,我检查是否有指向节点的右指针或左指针,并相应地设置临时值。如果节点没有左指针或右指针,我将获取节点的值并将其分配到向量。然后我需要删除这个节点(这就是问题所在),并再次使temp指向树的根。我的问题是我认为我不能删除最后一个节点。这是我的密码 void postO

我尝试对一棵树进行后序遍历。树的节点有一个int数据和两个指针,一个向左,一个向右。我有一个函数给我树的头。我所做的是: 我创建一个临时节点并将其设置为头部。而我要做的是迭代到树,直到这个临时值变为null ptr。因此,在每次迭代中,我检查是否有指向节点的右指针或左指针,并相应地设置临时值。如果节点没有左指针或右指针,我将获取节点的值并将其分配到向量。然后我需要删除这个节点(这就是问题所在),并再次使temp指向树的根。我的问题是我认为我不能删除最后一个节点。这是我的密码

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 << " ";
}
void postOrder(节点*根)
{
矢量结果;
Node*tmp=nullptr;
tmp=根;
int-val=0;
而((tmp!=nullptr)){
如果(tmp->left!=nullptr){
tmp=tmp->左;
}
else if(tmp->right!=nullptr){
tmp=tmp->右侧;
}
否则{
val=tmp->data;

cout指针保存另一个变量的内存地址。这意味着当您执行*tmp=null时,它现在指向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 << " ";
}
void postOrder(节点*根)
{
矢量结果;
Node*tmp=nullptr;
tmp=根;
int-val=0;
节点*prv=根;
而((tmp!=nullptr))
{
如果(tmp->left!=nullptr){
prv=tmp;
tmp=tmp->左;
}
else if(tmp->right!=nullptr){
prv=tmp;
tmp=tmp->右侧;
}
否则{
val=tmp->data;
cout left!=NULL)prv->left=NULL;
else prv->right=NULL;
tmp=根;
}
}
用于(自动&e:结果)

我需要删除这个节点--这与后序遍历有什么关系?树的后序遍历通常通过递归或使用堆栈来完成。函数两者都不需要。在考虑如何处理节点(一旦到达节点)之前,让常规后序遍历实际执行该工作.@PaulMcKenzie这是我尝试的方法。如果我能让它工作,为什么我应该使用递归或堆栈如果我能让它工作——是的,如果你能让它工作。为什么你要尝试发明一种方法来做这件事,当它是众所周知的如何做的时候?如果你使用正确的,众所周知的技术,没有任何问题……这就是你正在尝试的吗为了实现?IMHO,在post顺序中,您先检查右子树,然后检查当前节点,然后检查左子树。您没有这样做。