找树中同方向的最长路径。
例如:以下树 返回7.
/* 1
* 2 3
* 3 4
* 6 1
* 7
* 9
* 11
* 2
* 14
* */
代码如下:复杂度为O(n):
第二种解法比较优。
/*
* 第一种解法:
* 返回左边最长,右边最长,及左子树最长,右子树最长。
* */
public static int findLongest(TreeNode root) {
if (root == null) {
return -1;
}
TreeNode l = root;
int cntL = 0;
while (l.left != null) {
cntL++;
l = l.left;
}
TreeNode r = root;
int cntR = 0;
while (r.right != null) {
cntR++;
r = r.right;
}
int lmax = findLongest(root.left);
int rmax = findLongest(root.right);
int max = Math.max(lmax, rmax);
max = Math.max(max, cntR);
max = Math.max(max, cntL);
return max;
}
/* 1
* 2 3
* 3 4
* 6 1
* 7
* 9
* 11
* 2
* 14
* */
public static int findLongest2(TreeNode root) {
int [] maxVal = new int[1];
maxVal[0] = -1;
findLongest2Help(root, maxVal);
return maxVal[0];
}
// ret:
// 0: the left side longest,
// 1: the right side longest.
static int maxLen = -1;
static int[] findLongest2Help(TreeNode root, int[] maxVal) {
int[] ret = new int[2];
if (root == null) {
ret[0] = -1;
ret[1] = -1;
return ret;
}
ret[0] = findLongest2Help(root.left, maxVal)[0] + 1;
ret[1] = findLongest2Help(root.right, maxVal)[1] + 1;
//maxLen = Math.max(maxLen, ret[0]);
//maxLen = Math.max(maxLen, ret[1]);
maxVal[0] = Math.max(maxVal[0], ret[0]);
maxVal[0] = Math.max(maxVal[0], ret[1]);
return ret;
}