tree 543_687_968

543. Diameter of Binary Tree

给一个二叉树,求最长路径的长度。

就是遍历二叉树时对每个结点获取左子树的最大长度和右子树的最大长度,相加后和当前最大值比较。但是helper返回值是左右子树中较长的那一个,然后要注意长度是边数,所以有些许不同:

int max = 0;
public int diameterOfBinaryTree(TreeNode root) {
    helper(root);
    return max;
}

public int helper(TreeNode root) {
    if (root == null) return 0;

    int l = helper(root.left);
    int r = helper(root.right);
    if (l+r > max) {
        max = l+r;
    }
    return Math.max(l, r)+1;
}

687. Longest Univalue Path

上题类似,也是找最大的路径长度,但是要求这个路径中所有结点值相等。

思路和上题一样,但是在其中多了两个判断:

  1. 每个结点是否等于其左右孩子结点,相等的话就路径都加一,并且相加,然后更新max
  2. 不等的话就在helper中返回较长的那一边(如果该结点和它的两个孩子都不同,那就返回0,因为最长相同路径断开了)
public int longestUnivaluePath(TreeNode root) {
    helper(root);
    return max;
}

int max = 0;
public int helper(TreeNode root) {
    if (root == null) return 0;
    int ll = 0, rr = 0;

    int l = helper(root.left);
    int r = helper(root.right);
    if (root.left != null && root.val == root.left.val) {
        ll = l + 1;
    }
    if (root.right != null && root.right.val == root.val) {
        rr = r + 1;
    }

    if (ll + rr > max)
        max = ll + rr;
    

    return Math.max(ll, rr);
}

968. Binary Tree Cameras

给一个二叉树,求出使用的最小的监控器,使得所有的结点都在监控范围内,每个监控器可以监控它自身,它的两个孩子结点和它的父结点。

有点技巧的,采用自底向上的方法(后序遍历):

  1. 递归判断每个结点的两个孩子结点的状态
  2. 如果孩子结点是空结点,就把它看作是已经受到监控的结点,设当前结点为未访问状态,返回0
  3. 如果孩子结点中只要有一个是未访问状态,那么当前结点就设为监控器,返回2
  4. 如果孩子结点中有任何一个是监控器,就把当前结点设为受到监控,返回1
  5. 如果两个孩子都是受到监控状态,则把当前结点设为未访问状态,返回0
  6. 最后根据根结点的状态再设根结点是否为监控器
int res = 0;
public int minCameraCover(TreeNode root) {
    if (helper(root) == 0) return res+1;
    return res;
}

//0:未访问的结点
//1:被监控覆盖的结点
//2:监控结点
public int helper(TreeNode root) {
    if (root == null) return 1;

    int l = helper(root.left);
    int r = helper(root.right);

    if (l == 0 || r == 0) {
        res++;
        return 2;
    }

    if (l == 2 || r == 2)
        return 1;

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值