关于二叉树的非递归遍历的算法疑惑

二叉树的遍历让递归算法的思想得到了无限的魅力施展，可以说二叉树的操作由于递归而变得简单和易于操作，只要搞清楚递归的本质和代码原理即可

我看了一些帖子，有点看不懂，自己尝试用流程框架来打印出所有元素，但都失败了，要么只能打印特定的二叉树，要么是重复打印，所以在想是不是除了栈，没有其他的方法了

//中序遍历--左中右打印
int print_middle(pnode_t proot)
{
if(proot == NULL)
{
printf("print wrong\n");
return;
}
pnode_t father = NULL;
pnode_t tmp = NULL;
tmp = father;
while(proot != NULL)
{
//printf("here2\n");
father = proot;
if((father->data == 9)&&( father->left == NULL)&&(father->right == NULL))
{
break;
}
while(father != NULL)
{
//printf("here2\n");
//printf("data=%d\n",proot->data);
//break;
//father = proot;
while( father != NULL )
{
tmp = father;
father = father->left;
}
father = tmp;
printf("%d ",father->data);
if(father->right != NULL)
{
father = father->right;
}
tmp = father;
//printf("%d\n",father->data);
//break;
//printf("here\n");
if((father->left == NULL)&&(father->right == NULL))
{
//printf("here2\n");
pnode_t new = NULL;
new = find_lr_node(proot,father->data);
//printf("new=%d\n",new->data);
//printf("father=%d\n",father->data);
if(new->left != NULL)
{
if(new->left->data == father->data)
{

printf("%d ",new->data);
new->left = NULL;
father = NULL;

pnode_t p = NULL;
p = find_lr_node(proot,new->data);
//printf("p=%d\n",p->data);
if(p->left != NULL)
{
if(p->left->data == new->data)
p->left = NULL;
new = NULL;
}
else if(p->right != NULL)
{
//printf("here3\n");
if(p->right->data == new->data)
//free(p->right);
p->right = NULL;
new = NULL;
}
//free(p->right);
//printf("p=%d\n",p->data);
//break;
}
}

else if(new->right != NULL)

{
if(new->right->data == father->data)
{
printf("%d ",new->data);
new->right = NULL;
father = NULL;
pnode_t pp = NULL;
pp = find_lr_node(proot,new->data);
if(pp->left != NULL)
{
if(pp->left->data == new->data)
pp->left = NULL;
new = NULL;
}
if(pp->right != NULL)
{
if(pp->right->data == new->data)
pp->right = NULL;
new = NULL;
}
}
}
//printf("here5\n");
//printf("here\n");
//break;

}
//printf("here6\n");

}
}
printf("\n");

}

• 本文已收录于以下专栏：

史上最简明易懂非递归遍历二叉树算法

• QiaoRuoZhuo
• 2014年10月29日 14:59
• 3823

对于二叉树三种非递归遍历方式的理解

• sdulibh
• 2016年01月24日 11:25
• 1618

二叉树的非递归遍历及算法分析

• u012914709
• 2015年03月20日 22:29
• 696

经典算法学习——非递归遍历二叉树

• CHENYUFENG1991
• 2016年10月03日 12:28
• 2402

【数据结构与算法】二叉树递归与非递归遍历（附完整源码）

• mmc_maodun
• 2013年10月24日 08:58
• 40942

详细讲解二叉树三种遍历方式的递归与非递归实现

• pi9nc
• 2013年10月24日 23:44
• 44666

二叉树几种遍历算法的非递归实现

• kelvinmao
• 2016年05月15日 11:43
• 4626

二叉树的遍历详解（前序中序后序层次-递归和非递归）

• gatieme
• 2016年04月15日 17:04
• 7044

二叉树的前序、中序、后序的递归与非递归遍历算法实现

• u011954296
• 2016年07月12日 12:31
• 2802

二叉树的四种遍历（递归、非递归）

1、递归遍历/** * 先序遍历 * @param root */ public void printFirstTree(TreeNode root){ ...
• GYQJN
• 2016年09月30日 11:20
• 1051

举报原因： 您举报文章：关于二叉树的非递归遍历的算法疑惑 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)