美文网首页
LeetCode 第 B 题:二叉树任意两节点之间的最短路径

LeetCode 第 B 题:二叉树任意两节点之间的最短路径

作者: 放开那个BUG | 来源:发表于2021-07-14 21:15 被阅读0次

1、前言

题目描述:一棵二叉树 root,给定两个节点 p、q,求 p、q 之间的距离,也就是从 p 到 q 的距离。

2、思路

这道题是两年前实习的时候,才云科技问的题目(当时投的算法岗 QAQ),奈何当时基础很差,没答出来,也听不懂。

此题的思路是,先求两个节点的最近公共祖先,然后从最近公共祖先出发,求祖先节点到两个节点的距离,距离之和就是两个节点的最短路径。

3、代码

public class QB_ShortPath {


    public int shortPath(TreeNode root, TreeNode p, TreeNode q){
        TreeNode ans = lowestAns(root, p, q);

        int one = getPath(ans, p) - 1;
        int two = getPath(ans, q) - 1;

        return one + two;
    }

    /**
     * 求距离
     * @param root
     * @param target
     * @return
     */
    private int getPath(TreeNode root, TreeNode target) {
        if(root == null){
            return 0;
        }

        int left = getPath(root.left, target);
        int right = getPath(root.right, target);

        if(root == target){
            return 1;
        }

        if(left == 0 && right == 0){
            return 0;
        }

        return left == 0 ? right + 1 : left + 1;
    }

    /**
     * 求公共祖先
     * @param root
     * @param p
     * @param q
     * @return
     */
    private TreeNode lowestAns(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null || root == p || root == q){
            return root;
        }

        TreeNode left = lowestAns(root.left, p, q);
        TreeNode right = lowestAns(root.right, p, q);

        if(left == null && right == null){
            return null;
        }

        if(left == null){
            return right;
        }
        if(right == null){
            return left;
        }

        return root;
    }

    public static void main(String[] args) {
        TreeNode t1 = new TreeNode(1);
        TreeNode t2 = new TreeNode(2);
        TreeNode t3 = new TreeNode(3);
        TreeNode t4 = new TreeNode(4);
        TreeNode t5 = new TreeNode(5);
        TreeNode t6 = new TreeNode(6);
        TreeNode t7 = new TreeNode(7);
        TreeNode t8 = new TreeNode(8);

        t1.left = t2;
        t1.right = t3;
        t2.left = t4;
        t2.right = t5;
        t4.left = t6;
        t4.right = t7;
        t5.left = t8;

        System.out.println(new QB_ShortPath().shortPath(t1, t7, t3));
    }
}

相关文章

网友评论

      本文标题:LeetCode 第 B 题:二叉树任意两节点之间的最短路径

      本文链接:https://www.haomeiwen.com/subject/lorxultx.html