如果我们把二叉树视为一个图,父子几点之间的连线视为是双向的,我们可以把“距离”定义为来两结点之间边的个数。
计算一个二叉树的最大距离有两种情况:
情况A:路径经过左子树,通过根节点,再到右子树饿最深节点。
情况B:路径不经过根节点,而是左子树或者右子树的最大距离路径,取其大者。
只需要计算这两个情况的路径距离,并取其大者,就是该二叉树的最大距离。
代码如下:
1 typedef struct BTNode 2 { 3 int data; 4 BTNode * lc; 5 BTNode * rc; 6 }BTNode,*BinTree; 7 8 typedef struct RESULT 9 { 10 int nMaxDistance; 11 int nMaxDepth; 12 }RESULT; 13 14 //算法函数 15 RESULT getMaxDistance(NODE *node) 16 { 17 if(!node)//递归到最大深度才进行初始化 18 { 19 RESULT empty = {0,-1}; 20 return empty; 21 } 22 //对左右子树进行递归遍历 23 RESULT lhs=getMaxDistance(node->lc); 24 RESULT lhs=getMaxDistance(node->rc); 25 RESULT result; 26 result.nMaxDepth = max(lhs.nMaxDepth+1,rhs.nMaxDepth+1);//加1,因为连接到根节点 27 result.nMaxDistance=max(max(lhs.nMaxDistance,rhs.nMaxDistance),lhs.nMaxDepth+1+rhs.nMaxDepth+1); 28 return result; 29 }
为了减少NULL的条件测试,进入函数时,如果结点为NULL,会传回empty变量。其中将empty.nMaxDepth初始化为-1,目的是让调用方+1后,把无子树结点的最大深度置为0。