前天去美团面试,二面基本一路顺风,后来,碰到一个用非递归的方法求解二叉树高度,并要求现场写程序,一下就卡住了,非常不爽。这两天把这个部分恶补了一下,总结了一下思路如下。
1、考虑清楚解题类似于遍历中的前序 or 中序 or 后续;
2、考虑清楚在递归程序中,每次会有哪些内容需要进栈:节点本身、返回地址(用于告诉程序返回后应该从何处执行)、局部变量、返回值。
下面先上代码,并比较得出思路。
首先,我们看一下先序遍历的递归和非递归程序:
void PreTraverse(CNode *subTree, bool (*Visit)(CNode *))
{
if (subTree)
{
Visit(subTree);
PreTraverse(subTree->lchild, Visit);
PreTraverse(subTree->rchild, Visit);
}
}
void PreTraverseNonRecursive(CNode *subTree, bool (*Visit)(CNode *))
// 你会把这个函数按照后边的形式简化吗^^这个函数来源于网络,个人认为写的比较繁琐。你可以使用三个case简化。
{
std::stack<CNode*> s;
CNode *t = subTree;
s.push(t);
while (!s.empty())
{
while (!s.empty()) // go left until the most left child
{
t = s.top(); // notice: without pop!!
if (!t)break;
Visit(t);
s.push(t-