题目
如果我们把二叉树视为一个图,父子节点之间的连线视为双向的,我们姑且定义为“举例”为两节点之间边的个数。 写一个程序求一颗二叉树中相距最远的两个节点之间的距离。
分析
刚开始我的分析很简答,就是分别求左右子树的最大深度,然后加起来就是最大距离。但是这是不完全正确的,看下图
左边的最长距离路劲并没有经过根节点,所以这种考虑,只是考虑到了右边经过根节点的情况。
因此,我们只需要分别计算左右子树最大的距离(不经过根节点),还有经过根节点的左右子树的最大深度,返回较大的一个就行
代码
// 设置一个全局变量存储最长长度
int maxLengthValue = 0;
public static int maxLength(treeNode root){
if(root == null){
reture -1;
}
// 每遍历一个节点,如果左子树不为空,长度增加1
if(root.left != null){
root.leftLength = maxLength(root.left) + 1;
}else{
root.leftLength = 0;
}
// 每遍历一个节点,右子树不为空,长度增加1
if(root.right != null){
root.rightLength = maxLength(root.right) + 1;
}else{
root.rightLength = 0;
}
if(maxLengthValue < (root.leftLength + root.rightLength)){
maxLengthValue = (root.leftLength + root.rightLength);
}
return root.leftLength > root.rightLength?root.leftLength : root.rightLength;
}