题目描述:
给你二叉树的根节点 root 和一个整数 distance 。
如果二叉树中两个 叶 节点之间的 最短路径长度 小于或者等于 distance ,那它们就可以构成一组 好叶子节点对 。
返回树中 好叶子节点对的数量 。
解题思路:
对于任何的节点node,分别求节点node的左右叶子节点到node的距离,再计算每个左叶子节点与右叶子节点的距离。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int res_dfs = 0;
public int countPairs(TreeNode root, int distance) {
if(root != null){
countnum(root, distance);
countPairs(root.left, distance);
countPairs(root.right, distance);
}
return res_dfs;
}
public void countnum(TreeNode root, int distance){
int start = 0;
//计算节点root的到左右叶子节点的距离
List<Integer> leftLen = new ArrayList<Integer>();
List<Integer> rightLen = new ArrayList<Integer>();
if(root != null){
if(root.left != null){
countLen(root.left, start + 1, distance, leftLen);
}
if(root.right != null){
countLen(root.right, start + 1, distance, rightLen);
}
}
for(int i=0; i<leftLen.size(); i++){
for(int j=0; j<rightLen.size(); j++){
int count = leftLen.get(i) + rightLen.get(j);
if(count < distance || count == distance){
res_dfs = res_dfs + 1;
}
}
}
}
public void countLen(TreeNode root,int len ,int distance,List<Integer> leaflen){
if(len < distance){
if(root.left != null){
countLen(root.left, len+1, distance, leaflen);
}
if(root.right != null){
countLen(root.right, len+1, distance, leaflen);
}
if(root.left == null & root.right == null){
leaflen.add(len);
}
}
}
}