-
分析
-
二叉树:一个节点只有两个子节点,左和右。
-
路径:节点与节点之间的连线就是一条路径
同值路径:节点和与子节点或者父节点之间的值相同,那么这就是一条同值路径,本题求的就是这个最大值。 -
边数:可以理解为题目示例中连接节点的直线。
-
这一类问题,需要用递归的方法解决。在二叉树中,只能从根节点向下递归调用,可以通过root.left和root.right的方法得到两个子节点的TreeNode对象,由此一层一层递归调用下去,直到最底端的叶节点。
-
第一个可能遇到的坑:如果当前节点与左节点的值不同,那么左边的同值路径就会断掉,同理,如果和右节点值不同,右边的同值路径就会断掉。一旦断掉,那么当前节点的同值路径值就应该清零。
-
第二个可能遇到的坑:如果当前节点与子节点的值不同,那么从子节点连过来的同值路径就断掉了,而如果当前节点和父节点的值相同,需要注意,会从本节点向父节点连一个新的同值路径,与从子节点来的同值路径无关,不可累加。本题求解的是多条同值路径中最长的那条。
-
-
参考解(java)
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
class Main {
int ans;
public int longestUnivaluePath(TreeNode root) {
ans = 0;
arrowLength(root);
return ans;
}
public int arrowLength(TreeNode node) {
if (node == null) return 0;
int left = arrowLength(node.left);
int right = arrowLength(node.right);
int arrowLeft = 0, arrowRight = 0;
if (node.left != null && node.left.val == node.val) {
arrowLeft += left + 1;
}
if (node.right != null && node.right.val == node.val) {
arrowRight += right + 1;
}
ans = Math.max(ans, arrowLeft + arrowRight);
return Math.max(arrowLeft, arrowRight);
}
public static void main(String []args) {
TreeNode root = new TreeNode(5);
TreeNode node1 = new TreeNode(4);
TreeNode node2 = new TreeNode(5);
TreeNode node3 = new TreeNode(1);
TreeNode node4 = new TreeNode(1);
TreeNode node5 = new TreeNode(5);
root.left=node1;
root.right=node2;
node1.left=node3;
node1.right=node4;
node2.right=node5;
Main ss=new Main();
System.out.println(ss.longestUnivaluePath(root));
}
}