题目
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
示例 1:
输入:
5 / \ 4 5 / \ \ 1 1 5输出:
2示例 2:
输入:
1 / \ 4 5 / \ \ 4 4 5输出:
2注意: 给定的二叉树不超过10000个结点。 树的高度不超过1000。
分析
找二叉树的最长相同节点路径数,对于每个节点来说,都可以将自己看作根节点,可以独立的看为一棵树,它的最长路径数要么是左子树的最长路径数,要么是右子树的最长路径数,要么就是左右子树的路径数相加(当然前提是左右子树的节点值和根节点值相等),这样用递归来解。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
static int max = 0;
public int longestUnivaluePath(TreeNode root) {
if (root == null) return 0;
max = 0;
iterator(root);
return max;
}
public static int iterator(TreeNode root){
int left = 0;
int right = 0;
if (root.left != null && root.val == root.left.val)
left = 1 + iterator(root.left);
else if (root.left != null)
iterator(root.left);
if (root.right != null && root.val == root.right.val)
right = 1 + iterator(root.right);
else if (root.right!=null)
iterator(root.right);
if (left + right > max) max = left + right;
return left > right ? left:right;
}
}