最长同值路径

  1. 分析

    1. 二叉树:一个节点只有两个子节点,左和右。

    2. 路径:节点与节点之间的连线就是一条路径
      同值路径:节点和与子节点或者父节点之间的值相同,那么这就是一条同值路径,本题求的就是这个最大值。

    3. 边数:可以理解为题目示例中连接节点的直线。

    4. 这一类问题,需要用递归的方法解决。在二叉树中,只能从根节点向下递归调用,可以通过root.left和root.right的方法得到两个子节点的TreeNode对象,由此一层一层递归调用下去,直到最底端的叶节点。

    5. 第一个可能遇到的坑:如果当前节点与左节点的值不同,那么左边的同值路径就会断掉,同理,如果和右节点值不同,右边的同值路径就会断掉。一旦断掉,那么当前节点的同值路径值就应该清零。

    6. 第二个可能遇到的坑:如果当前节点与子节点的值不同,那么从子节点连过来的同值路径就断掉了,而如果当前节点和父节点的值相同,需要注意,会从本节点向父节点连一个新的同值路径,与从子节点来的同值路径无关,不可累加。本题求解的是多条同值路径中最长的那条。

  2. 参考解(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));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值