提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
二叉树的遍历通常采用递归遍历的方式,而非递归遍历二叉树需要使用到栈,利用栈的先进后出的存储特性可实现对树的非递归遍历。
一、创建一棵二叉树
如图所示:
它的先序遍历为:ABCDEFGH
它的中序遍历为:BDCEAFHG
它的后序遍历为:DECBHGFA
二、具体步骤
1.思路
(1)新建一个结构体包含二叉树节点指针以及标志位flag。
struct BinaryTreeStackNode
{
BinaryNode* root;
int flag;
};
(2)在创建栈之后首先将根节点压入栈中,将此节点的标志位设置为FALSE。
(3)之后开始判断栈内是否为空,不为空则并往外弹出数据,取得栈顶节点,判断取出根节点是否为空,为空则continue继续循环,否则将判断标志位是否为TRUE,若为TRUE则输出此根节点的值,若为FALSE则将其标志位设置为TRUE,(这里为先序遍历)之后依次压入此根节点的右孩子,与左孩子,并将二者的标志位设置为FALSE,最后压入此根节点。与先序遍历的顺序恰好相反。
(4)若是中序或者是后续,在压入栈节点时只需按照与遍历顺序相反的顺序压入即可,节点第一次压入时标志位都为FALSE,在作为栈顶节点弹出式再修改为TRUE。
2.部分代码
//创建栈中的节点
BinaryTreeStackNode* CreateBinaryTreeStackNode(BinaryNode* node1, int flag)
{
BinaryTreeStackNode* bsn = new BinaryTreeStackNode;
bsn->root = node1; //node1为外部传入的当前根节点
bsn->flag = flag; //flag为标志位
return bsn;
}
void NonRecursion(BinaryNode* root)
{
//创建栈
stack<BinaryTreeStackNode*> s;
s.push(CreateBinaryTreeStackNode(root, MY_FALSE));
while (s.size()> 0) {
BinaryTreeStackNode* node = s.top();
s.pop();
if (node->root == nullptr)
{
continue;
}
if (node->flag == MY_TRUE)
{
cout << node->root->value;
}
else
{
node->flag = MY_TRUE;
//先序遍历
//右入
s.push(CreateBinaryTreeStackNode(node->root->rchild, MY_FALSE));
//左入
s.push(CreateBinaryTreeStackNode(node->root->lchild, MY_FALSE));
s.push(node);
}
}
}
结果演示示例:
总结
以上就是今天要讲的内容,本文仅仅简单介绍了二叉树的非递归遍历,可以作为遍历二叉树时的一种思路。