给定一棵二叉树的根节点 root 以及两个整数 p 和 q ,返回该二叉树中值为 p 的结点与值为 q 的结点间的 距离 。
两个结点间的 距离 就是从一个结点到另一个结点的路径上边的数目。
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 0
输出:3
解释:在 5 和 0 之间有 3 条边:5-3-1-0
【思路】:
1、遍历每一个节点,看其能否到达p,q两个目标节点。
如果都可以到达的情况下,保存一个距离的最小值。
思路2:
也可以借助前面实现的求最近公共祖先的方法。如果能求出祖先,再直接去求两边的距离也可以。
【代码】:
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
//得到node到target节点的距离。到不了就返回-1
var getDis = function(node, target){
if(node == null) return -1;
if(node.val == target) return 0;
let left = getDis(node.left, target);
let right = getDis(node.right, target);
if(left == -1 && right == -1){
return -1;
}else if(left == -1){
return right + 1;
}else{
return left + 1;
}
}
//res中存放所有能到target的节点,以及距离
var order = function(node, res, target){
if(node){
let dis = getDis(node, target);
if(dis != -1){
res.push({node: node.val, target:target, dis:dis});
}
order(node.left, res, target);
order(node.right, res, target);
}
}
/**
* @param {TreeNode} root
* @param {number} p
* @param {number} q
* @return {number}
*/
var findDistance = function(root, p, q) {
var res1 = []; //p
var res2 = []; //q
order(root, res1, p);
order(root, res2, q);
var minDis = Number.MAX_SAFE_INTEGER;
for(let i = 0;i < res1.length;i++){
let node = res1[i].node;
for(let j = 0;j < res2.length;j++){
if(res2[j].node == node){
let dis = res1[i].dis + res2[j].dis;
minDis = Math.min(dis, minDis);
}
}
}
return minDis
};