在做二叉树中最近公共父结点这个题时,发现有求某个结点路径的需求。问题:给定二叉树中某个结点的值,求从根结点到这个结点的路径。
思路肯定是直接遍历,但是在遍历的过程中如何保存当前节点的路径呢?可以维护一个队列。网上找了会后,觉得可以在前序递归遍历时,维护队列。但是当找到要找的结点时,如何停止递归呢?问题相当于如何从深递归中直接退出,网上的答案主要有两种方法,一种是抛出一个异常,另外是设置一个全局变量。我采用了第二种方法,为了得到路径的长度,又加了一个int的引用作为参数,相当于定义了两个全局变量。我觉得这种方法不好。便想如何用非递归实现,后来发现非递归后序遍历二叉树时,栈中的数据正好是要输出结点的路径!这个有点无法理解,看来对递归还是理解不深啊。于是在非递归遍历二叉树的基础上简单改了改。为了测试,还是用之前写的前序和中序遍历结果,来重建一棵二叉树。
递归加全局变量实现:
bool FLAG = false; //全局变量
void FindPath(Node* root, Node* s[], int top, char k, int &len) //找到某个结点的路径
{
if(FLAG) return;
if(root == NULL) return;
s[++top] = root;
if(root->chValue == k)
{
FLAG = true;
len = top+1;
return;
}
FindPath(root->pLeft,s,top,k,len);
FindPath(root->pRight,s,top,k,len);
}
FindPath(pRoot,s,-1,'e',len); //函数调用
非递归后序遍历实现:
int FindPat