//method 1
const shortestDistance = function(root, p, q) {
// 最近公共祖先
let zx = lowestCommonAncestor(root,p,q)
let pathp = [], pathq = []
getPath(zx,p,pathp)
getPath(zx,q,pathq)
return pathp.length + pathq.length
}
// 最近公共祖先
const lowestCommonAncestor = function(root, p, q) {
if(root == p || root == q || root == null) return root
let l = lowestCommonAncestor(root.left,p,q)
let r = lowestCommonAncestor(root.right,p,q)
if(!l) return r
if(!r) return l
return root
}
const getPath = function(root, p, paths) {
// 找到节点,返回 true
if(root === p) return true
// 当前节点加入路径中
paths.push(root)
let hasFound = false
// 先找左子树
if (root.left !== null)
hasFound = getPath(root.left, p, paths)
// 左子树没有找到,再找右子树
if (!hasFound && root.right !== null)
hasFound = getPath(root.right, p, paths)
// 没有找到,说明不在这个节点下面,则弹出
if (!hasFound)
paths.pop()
return hasFound
}
// method2
var lowestCommonAncestor = function(root, p, q) {
if (root===null||root===p||root===q) {
return root
}
let left = lowestCommonAncestor(root.left, p, q)
let right = lowestCommonAncestor(root.right, p, q)
if (left && right) {
return root
}
return left || right
};
let visited = false
let stack = []
var getDisToPar = function(root, p, stack) {
if(root==null){
return ;
}
//将节点添加到栈中
stack.push(root.val);
//如果找到了
if(!visited&&root==p){
visited = true;
return;
}
//先找左子树
if(!visited){
getDisToPar(root.left,p,stack);
}
//左子树没找到再找右子树
if(!visited){
getDisToPar(root.right,p,stack);
}
//如果还没找到,说明不在这个节点下面,弹出来
if(!visited){
stack.pop();
}
return;
}
给定两个树的节点,求它们的最短距离 JS
最新推荐文章于 2022-09-19 11:42:06 发布