前言
在Leetcode上发现一个非常实用而且简单的算法,分享给各位。
算法的优点在于如递归遍历一般,只需要简单调整代码的顺序,就可以轻松实现前、中、后序遍历。
思路
算法思路如下:
- 先建立一个堆栈。
- 针对堆栈中的每个节点,我们给它一个标签,false代表未遍历,true代表已遍历。
- 出栈时遇到标记为false的节点,将其左右节点分别标记为false插入堆栈,而节点本身标记为true。
- 出栈时遇到标记为true的节点,直接将其输出。
- 重复上面操作直到堆栈为空。
代码
void Fun(Tree **root) {
if (*root != NULL) {
// 堆栈
stack<Tree*> s;
//标签
stack<bool> tab;
//插入头指针,标签为false
s.push(*root);
tab.push(false);
while (s.size() > 0) {
//弹出指针和标签
Tree *p = s.top();
bool c = tab.top();
s.pop();
tab.pop();
//指针为空,continue
if (p == NULL)
continue;
//标签为true,输出当前节点的值
//标签为false,将左右节点标记为false插入,节点本身标记为true插入
if (c) {
cout << p->val << " ";
}
else {
//前序遍历
s.push(p->right);
tab.push(false);
s.push(p->left);
tab.push(false);
s.push(p);
tab.push(true);
//------------------//
//中序遍历
//s.push(p->right);
//q.push(false);
//s.push(p);
//q.push(true);
//s.push(p->left);
//q.push(false);
//------------------//
//后序遍历
//s.push(p);
//q.push(true);
//s.push(p->right);
//q.push(false);
//s.push(p->left);
//q.push(false);
}
}
cout << "\n";
}
}