二叉树系列——二叉树中任意两个节点之间的最短路径

来源:互联网 发布:淘宝模板的作用 编辑:程序博客网 时间:2024/06/03 12:30

来源:https://segmentfault.com/a/1190000003465753


题目:给定一棵二叉树的根节点和两个任意节点,返回这两个节点之间的最短路径


思路:两个节点之间的最短路径一定会经过两个节点的最小公共祖先,所以我们可以用LCA(最低公共祖先)的解法。不同于LCA的是,我们返回不只是标记,而要返回从目标结点递归回当前节点的路径。当遇到最小公共祖先的时候便合并路径。需要注意的是,我们要单独处理目标节点自身是最小公共祖先的情况。


Java代码实现如下:

public LinkedList<TreeNode> helper(TreeNode n, TreeNode p, TreeNode q){    if(n == null){        return null;    }        LinkedList<TreeNode> left = helper(n.left, p, q);    LinkedList<TreeNode> right = helper(n.right, p, q);        // 当左右都为空时    if(left == null && right == null){        // 如果当前节点是目标节点,开启一条新路径        if(n == p || n == q){            LinkedList l = new LinkedList<TreeNode>();            l.add(n);            return l;        } else {        // 否则标记为空            return null;        }    // 如果左右节点都不为空,说明是最小公共祖先节点,合并两条路径    } else if(left != null && right != null){        finalPath.addAll(left);        finalPath.add(n);        Collections.reverse(right);        finalPath.addAll(right);        return left;    // 如果当前节点是目标结点,且某一个子树不为空时,说明最小公共祖先是节点自身    } else if (left != null){        left.add(n);        if(n == p || n == q){            finalPath.addAll(left);        }        return left;    } else {        right.add(n);        if(n == p || n == q){            finalPath.addAll(right);        }        return right;    }}



1 0
原创粉丝点击