二叉树的非递归遍历/迭代法
用栈来实现二叉树的非递归遍历/迭代法。
前序遍历、后序遍历
在循环中,先将不为空的中节点入栈,再出栈并放入数组。然后先让右孩子节点入栈,再让左孩子节点入栈,这样先出栈的就是左孩子。直到栈为空,那么得到的数组就是前序遍历结果(中左右)。
代码实现如下:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
vector<int> result;
stk.push(root);
while (!stk.empty())
{
TreeNode* cur = stk.top();
stk.pop();
if (cur!=nullptr)
{
result.push_back(cur->val);
if (cur->right!=nullptr)
{
stk.push(cur->right);
}
if (cur->left!=nullptr)
{
stk.push(cur->left);
}
}
}
return result;
}
};
如果把入栈顺序改为先入左孩子再入右孩子,得到的结果就是中右左,这样翻转(reverse)整个数组后,最终得到的结果就是左右中,即为后序遍历。
代码如下:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
vector<int> result;
stk.push(root);
while (!stk.empty())
{
TreeNode* cur = stk.top();
stk.pop();
if (cur!=nullptr)
{
result.push_back(cur->val);
if (cur->left!=nullptr)
{
stk.push(cur->left);
}
if (cur->right!=nullptr)
{
stk.push(cur->right);
}
}
}
reverse(result.begin(),result.end());
return result;
}
};
中序遍历
中序遍历相对较为复杂。在循环中,要一路向左并沿路把遍历到的节点放到栈中。如果遍历到空,就弹出一个节点,并遍历到这个节点的右节点。注意循环条件为栈不为空或者当前遍历的节点不为空。
代码实现如下:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
vector<int> result;
TreeNode* cur = root;
while (!stk.empty() || cur!=nullptr)
{
if (cur!=nullptr)
{
stk.push(cur);
cur = cur->left;
}
else
{
cur = stk.top();
if (cur!=nullptr)
{
stk.pop();
result.push_back(cur->val);
cur = cur->right;
}
}
}
return result;
}
};