我再说说二叉树的中序遍历的递归与循环实现。
递归实现简单,我也不说了。
递归实现
void MidOrderVisitR(TreeNode* root, PVisitFun pvisit)
{
if(root == NULL)
return;
MidOrderVisitR(root->plc,pvisit);
pvisit(root);
MidOrderVisitR(root->prc,pvisit);
}
循环实现
一直访问节点的左孩子,直到左孩子为空。这个节点为叶子节点或者没有左孩子的节点。
根据中序遍历的特性,现在应该输出该节点。
再访问其右节点。
按照上面的思想,能得到以下代码。
void MidOrderVisitI(TreeNode* root, PVisitFun pvisit)
{
stack<TreeNode*> treeStack;
TreeNode* node = root;
while (node != NULL || !treeStack.empty())
{
while (node != NULL)
{
treeStack.push(node);
node = node->plc;
}
node = treeStack.top();
treeStack.pop();
cout<<node->data;
node = node->prc;
}
}