1740. 找到二叉树中的距离(DFS)

117 篇文章 0 订阅
42 篇文章 0 订阅

给定一棵二叉树的根节点 root 以及两个整数 p 和 q ,返回该二叉树中值为 p 的结点与值为 q 的结点间的 距离 。

两个结点间的 距离 就是从一个结点到另一个结点的路径上边的数目。


在这里插入图片描述

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 0
输出:3
解释:在 50 之间有 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
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值