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
上题类似,也是找最大的路径长度,但是要求这个路径中所有结点值相等。
思路和上题一样,但是在其中多了两个判断:
- 每个结点是否等于其左右孩子结点,相等的话就路径都加一,并且相加,然后更新max
- 不等的话就在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
给一个二叉树,求出使用的最小的监控器,使得所有的结点都在监控范围内,每个监控器可以监控它自身,它的两个孩子结点和它的父结点。
有点技巧的,采用自底向上的方法(后序遍历):
- 递归判断每个结点的两个孩子结点的状态
- 如果孩子结点是空结点,就把它看作是已经受到监控的结点,设当前结点为未访问状态,返回0
- 如果孩子结点中只要有一个是未访问状态,那么当前结点就设为监控器,返回2
- 如果孩子结点中有任何一个是监控器,就把当前结点设为受到监控,返回1
- 如果两个孩子都是受到监控状态,则把当前结点设为未访问状态,返回0
- 最后根据根结点的状态再设根结点是否为监控器
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;
}