二叉树遍历的非递归算法需要额外的数据结构支持,以栈为例
stack<BiTree *> st = stack<BiTree *>();
if (root)
st.push(root);
while (!st.empty()){
root = st.top();
visit(root->val);
st.pop();
if (root->right)
st.push(root->right);
if (root->left)
st.push(root->left);
}
st.push(root);
while (!st.empty()){
while (st.top()) // go left until end
st.push(st.top()->left);
st.pop(); // pop nullptr
if (!st.empty())
{
root = st.top();
st.pop();
visit(root->val);
st.push(root->right);
}
}
x = root;
while(true)
{
while(x) // walk along left branch
{
st.push(x);
x = x->left;
}
if(st.empty()) // 中止条件:栈空
break;
x = st.top(); // x 的左子树或空或已遍历
st.pop(); // 将 x 出栈并访问之
visit(x->val);
x = x->right; // 再转向右子树
}
后序遍历需要一个额外的指针提供信息
BiTree* pre = nullptr;
st.push(root);
while(!st.empty())
{
root = st.top();
if(root->left && root->left != pre && root->right != pre)
st.push(root->left);
else if(root->right == nullptr || root->right == pre)
{
pre = root;
visit(root->val);
st.pop();
}
else
st.push(root->right);
}
while (root || !st.empty())
{
if (root)
{
visit(root->val);
if (root->right)
st.push(root->right);
root = root->left;
}
else
{
root = st.top();
st.pop();
}
}
while(true)
{
x = root;
while(x) // 实现 Walk along left branch
{
visit(x->val); // 先序访问
st.push(x->right); // 右子树入栈
x = x->left; // 沿左侧链下行
}
if(st.empty()) // 栈空就终止遍历
break;
root = st.top(); // 弹出下一子树的根
st.pop();
}
while (root || !st.empty())
{
if (root)
{
st.push(root);
root = root->left;
}
else
{
root = st.top();
st.pop();
visit(root->val);
root = root->right;
}
}
后序遍历需要一个额外的指针提供信息
BiTree* pre = nullptr;
while (root || !st.empty())
{
if (root)
{
st.push(root);
root = root->left;
}
else
{
root = st.top();
if (root->right == nullptr || root->right == pre)
{
visit(root->val);
pre = root;
st.pop();
root = nullptr;
}
else
root = root->right;
}
}