二叉树--查找给定两个节点最下公共祖先

2020-07-02  本文已影响0人  今年花开正美

最近真是多事之秋,好好的日更被断了,计划永远是赶不上变化的,乘着睡前补上吧。
查找给定两个节点最下公共祖先,俗称LCA算法。

题目介绍

给定任意一个二叉树,以及两个节点,查找它们最小公共祖先。题目比较容易理解,就不补图了。

实现思路

先用暴力算法来实现吧,具体流程如下:
1、先定义两个节点List,分别用来存放给定两个节点的路径上所有节点。
2、分别递归遍历两次树,将路径填充到上述定义的List中。
3、最后将根节点加入到List尾部,因为路径必定包含根节点,所以最大的公共祖先就是根节点。
4、此时两个List的顺序为路径节点的倒叙,因此我们只要使用两个for循环找到第一个相等的节点就是所要求的解。

实现代码

public class SolutionLCA {

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        List<TreeNode> lPath = new ArrayList<>();
        List<TreeNode> rPath = new ArrayList<>();

        fill(root, p, lPath);
        fill(root, q, rPath);

        lPath.add(root);
        rPath.add(root);

        for (TreeNode lTreeNode : lPath) {
            for (TreeNode rTreeNode : rPath) {
                if (lTreeNode.val == rTreeNode.val) {
                    return lTreeNode;
                }
            }
        }
        return root;
    }

    public boolean fill(TreeNode root, TreeNode s, List<TreeNode> path) {

        if (null == root) {
            return false;
        }

        if (root.val == s.val) {
            return true;
        }

        boolean lExists = fill(root.left, s, path);
        if (lExists) {
            path.add(root.left);
            return true;
        }

        boolean rExists = fill(root.right, s, path);
        if (rExists) {
            path.add(root.right);
            return true;
        }

        return false;
    }
}

算法相关实现源码地址:https://github.com/xiekq/rubs-algorithms

上一篇 下一篇

猜你喜欢

热点阅读