我们知道,二叉树的遍历当中,后序非递归的遍历i是一个非常关键的操作
因为该遍历方式可以进行非常广泛的应用。我们先来介绍二叉树的非递归遍历的思想
由于二叉树的遍历是先遍历是左右根的顺序,于是二叉树在访问子节点的过程当中需要使用到堆栈,以及需要为每一个节点设置一个是否被访问的字段
思想如下:
1)通过一个循环不断地查找作孩子,直到该节点的左孩子为空 。在查找的过程当中,将所有经过的节点入栈。
在执行完以上过程以后,指针会停留在一个没有左孩子的节点当中
2)取出栈顶的元素(即是在第一步骤当中所停止的没有左孩子的节点),
3)如果该节点存在右孩子,并且右孩子未被访问将指针转右,将此孩子入放入栈,再继续转左,回到第一步的大循环当中
4)如果该节点并不存在右孩子,证明该节点是个终端节点,并且该节点是某次遍历中相对的左节点,则该节点应该被访问而且退栈并置null。
那么利用此程序的思想,我们可以实现以下操作
查找某个节点的所有祖先/输出一条到此节点的路径:在查找到某个节点时,栈内的所有节点均是该节点的祖先。将该祖先出栈并且输出路径即可。
#include <iostream>
#include <stack>
using namespace std;
class Node{
public:
int num;
bool visited;
Node