二叉树的三种遍历递归代码很容易实现。自己写下非递归算法有助于加深理解二叉树数据结构,代码是思路的实现,在纸上画个二叉树,手工实践下后序遍历的过程。如果会写先根序和中根序的非递归代码,稍微改一下,就容易得到后序非递归代码了。
不论哪种遍历,有个共同点,就是左边始终先于右边访问。大体思路和先/中根序一样,利用一个辅助栈,暂存一些后访问节点。只不过后序相对麻烦点,不像先/中根序遍历,后两者根节点先于根的右子树访问,根节点访问之后就可以“扔掉”,后序遍历需要一直保存根节点,直到其右子树访问完,最后再访问根节点。
后序需要标记每个节点是否被访问过,可以有两种方法:可以在二叉树节点结构增加一个标志域,标记当前节点是否已经被访问,见版本1; 也可不用在每个节点增加标志域,而是用set存储每个访问过的节点,见版本2。
具体代码如下:
手工画个例子,照着代码走一遍,加深理解。
/* 二叉树节点结构 */
struct BinaryTreeNode{
int data;
BinaryTreeNode* lchild;
BinaryTreeNode* rchild;
bool ha