二叉树遍历一般想到的都是递归遍历
这里介绍使用栈进行遍历
首先添加单项链表https://blog.csdn.net/weixin_40317531/article/details/85985566
由于但单向链表是企业链表所以可以用户设置节点将每个节点串联起来。下图为链表节点
下图为二叉树节点
下图,初始化链表节点
非递归
void NonRecursion(BinaryNode*root)
{
LinkStack*stack = Init_LinkStack();
//把根节点入栈
Push_LinkStack(stack, (LinkNode*)CreatBiTreeStackNode(root, MY_FALSE));
while (Size_LinkStack(stack)>0)
{
//先弹出栈顶元素
BiTreeStackNode * node = (BiTreeStackNode*)Top_LinkStack(stack);
Pop_LinkStack(stack);
//判断弹出节点是否为空
if (node->root ==NULL)
{
continue;
}
if (node->flag == MY_TRUE)
{
printf("%c", node->root->ch);
}
else
{
//当前节点右节点入栈
Push_LinkStack(stack,(LinkNode*) CreatBiTreeStackNode(node->root->rchild,MY_FALSE));
Push_LinkStack(stack, (LinkNode*)CreatBiTreeStackNode(node->root->lchild, MY_FALSE));
//当前节点入栈
node->flag = MY_TRUE;
Push_LinkStack(stack, (LinkNode*)node);
}
}
}
非递归树思想(栈)
1.首先初始化栈(链表)初始化A标志位设置MyFalse,将A扔进栈随后弹出,判断A的标识符号
2,A弹出之后,将A的左右子树初始化并且初始化标志位MyFalse,并且将A标志位改成True,因为是要先序遍历所以,先压入右子树F在压入左子树B最后A。
3.在判断B标志位是否是TRUE若不是重复步骤2.