求二叉树的任意两个节点的最大距离

 

Posted by     DH on September 8, 2017

题目

 如果我们把二叉树视为一个图,父子节点之间的连线视为双向的,我们姑且定义为“举例”为两节点之间边的个数。 写一个程序求一颗二叉树中相距最远的两个节点之间的距离。

分析

刚开始我的分析很简答,就是分别求左右子树的最大深度,然后加起来就是最大距离。但是这是不完全正确的,看下图

左边的最长距离路劲并没有经过根节点,所以这种考虑,只是考虑到了右边经过根节点的情况。

因此,我们只需要分别计算左右子树最大的距离(不经过根节点),还有经过根节点的左右子树的最大深度,返回较大的一个就行

代码

// 设置一个全局变量存储最长长度
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;
}