我尝试对树进行发布后遍历。树的节点有一个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,但这没有用;
答案 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 << " ";
}