c_lc_二叉搜索树的最近公共祖先 & 二叉树的最近公共祖先(利用性质 | 从p,q开始存储每个结点的父亲)

Lowest Common Ancestor of a BST

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)”

思路
这里是BST,三种很直观的情况:

  • p.val<root.val、q.val>p.val 时,LCA一定只能是根
  • p.val<root.val、q.val<p.val 时,LCA一定存在于左子树
  • p.val>root.val、q.val>p.val 时,LCA一定存在于左子树,而对于左右子树而言,也一定可以用情况一来讨论
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        while (root!=null) {
            if (p.val<root.val && q.val<root.val) root=root.left;
            else if (p.val>root.val && q.val>root.val) root=root.right;
            else break;
        }
        return root;
    }
}

Lowest Common Ancestor of a Binary Tree

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

class Solution {
    Map<Integer, TreeNode> fa;
    Set<Integer> vis;
    void dfs(TreeNode root) {
        if (root.left!=null) {
            fa.put(root.left.val, root);
            dfs(root.left);
        }if (root.right!=null) {
            fa.put(root.right.val, root);
            dfs(root.right);
        }
    }
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        fa=new HashMap<>();
        vis=new HashSet<>();
        dfs(root);
        while (p!=null) {
            vis.add(p.val);
            p=fa.get(p.val);
        }
        while (q!=null) {
            if (vis.contains(q.val)) break;
            q=fa.get(q.val);
        }
        return q;
    }
}
posted @ 2020-09-27 21:26  童年の波鞋  阅读(175)  评论(0编辑  收藏  举报