设计一个非递归算法以输出二叉树t中先序序列中最后一个结点的值。 void print(bnod *t)
时间: 2024-01-22 07:20:05 浏览: 66
可以使用迭代方式实现先序遍历二叉树,并记录最后一个访问的结点的值,最后输出即可。
具体实现如下:
```
void print(bnod *t) {
if (t == nullptr) {
return;
}
stack<bnod*> s;
bnod* lastVisited = nullptr;
s.push(t);
while (!s.empty()) {
bnod* cur = s.top();
if ((cur->left == nullptr && cur->right == nullptr) || lastVisited == cur->right || (lastVisited == cur->left && cur->right == nullptr)) {
// 当前结点为叶子结点,或者上一次已经访问了右子树,或者上一次访问了左子树且当前结点没有右子树
lastVisited = cur;
s.pop();
} else {
if (lastVisited != cur->left) {
// 还未访问左子树
cout << cur->val << " ";
s.push(cur->left);
} else {
// 已经访问完左子树,访问右子树
s.push(cur->right);
}
}
}
cout << lastVisited->val << endl; // 输出最后访问的结点的值
}
```
其中,使用了一个 `lastVisited` 变量来记录上一次访问的结点,在判断是否访问右子树时使用。如果最后一次访问的结点是右子树,或者当前结点为叶子结点,或者上一次访问了左子树且当前结点没有右子树,那么就可以将当前结点出栈,并更新 `lastVisited` 为当前结点。如果还未访问左子树,就输出当前结点的值,并将左子树入栈;如果已经访问完左子树,就将右子树入栈。
最后,输出 `lastVisited` 的值即可。
阅读全文