我没想出来非递归的算法。下面的程序虽然没有明显的递归调用,但是思路仍然是递归的:
BTNode *p = pRoot;
v.push_back(p);
while (!v.empty()) {
if (v.back()->nMaxLeft == -1) {
if (v.back()->pLeft != 0) {
v.push_back(v.back()->pLeft);
}
else {
v.back()->nMaxLeft = 0;
}
}
else if (v.back()->nMaxRight == -1) {
if (v.back()->pRight != 0) {
v.push_back(v.back()->pRight);
}
else {
v.back()->nMaxRight = 0;
}
}
else {
int maxValue = v.back()->nMaxValue;
int maxChild = v.back()->nMaxLeft > v.back()->nMaxRight ? v.back()->nMaxLeft : v.back()->nMaxRight;
v.pop_back();
if (!v.empty()) {
if (v.back()->nMaxLeft == -1) {
v.back()->nMaxLeft = maxChild + 1;
v.back()->nMaxValue = maxValue;
}
else {
v.back()->nMaxRight = maxChild + 1;
v.back()->nMaxValue = v.back()->nMaxValue > maxValue ? v.back()->nMaxValue : maxValue;
int val = v.back()->nMaxLeft + v.back()->nMaxRight;
v.back()->nMaxValue = val > v.back()->nMaxValue ? val : v.back()->nMaxValue;
}
}
else {
MAX_VALUE = maxValue;
}
}
}
}
对于一般的二叉树结构,使用递归算法比较常见,因为二叉树本身的性质使然。尤其对于使用指针构建的二叉树更是如此,不仅因为递归自然而简单,也因为非递归很难实现。但是对于可以直接访问到父子节点的结构来讲,例如使用数组表示的完全二叉树,自然是可以使用迭代从树的最后一个叶子节点向根节点方向遍历一次求出答案。对于非完全二叉树,也可以表示成数组的形势并且进行遍历。具体的算法和书中所写应该是一样的,伪代码可能如下:
Node nodes[maxNodeNum];
for (int i=maxNodeNum; i>0; i--) {
if (i >= (maxNodeNum + 1) / 2) {
// leaf
nodes[i].maxLeft = 0;
nodes[i].maxRight = 0;
}
else {
nodes[i].maxLeft = nodes[i*2].maxLeft > nodes[i*2].maxRight ? nodes[i*2].maxLeft : nodes[i*2].maxRight + 1;
nodes[i].maxRight = nodes[i*2+1].maxLeft > nodes[i*2+1].maxRight ? node[i*2+1].maxLeft : nodes[i*2+1].maxRight + 1;
if (nodes[i].maxLeft + nodes[i].maxRight > MaxLen)
MaxLen = nodes[i].maxLeft + nodes[i].maxRight;
}
}