非递归中序遍历
中序遍历的顺序为:左-中-右,通过栈这个数据结构来记录遍历的历史,思想如下:
1. 找到左子树的底部叶子节点,打印叶子节点(期间将所有经过的节点压栈,用于回退到父节点用)
2. 回退到叶子节点的父节点,打印父节点(在1走到左叶子节点的过程中,通过栈记录下父节点)
3. 从父节点进入右儿子,再重复1,2
代码如下:
递归实现:
void middleOrder(Node* node)
{
if (node == nullptr)
{
return;
}
middleOrder(node->left);
cout(node->value);
middleOrder(node->right);
}
非递归实现:
void middleOrder(Node* root)
{
Node* node = root;
while(!stack.empty() && node != nullptr)
{
(代码片段1)
// 找到左边叶子节点,期间压栈本节点
while (node->left != nullptr)
{
stack.push(node);
node = node->left;
}
(代码片段2)
// 找到叶子节点,弹出本节点
node = stack.pop();
print(node->value);
//叶子节点的父节点,弹出父节点
node = stack.pop();
print(node->value);
// 处理右儿子
if (node->right != nullptr)
{
node = node->right;
}
}
}
这篇文章分析得更细致一些,供参考: