zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
  • 相关阅读:
    高德地图SDK大致使用
    AFNetworking 使用
    蓝牙相关
    svn 常用命令
    通过AutoLayout显示三个等宽视图
    适配相关 --AutoLayout ---SizeClass
    常用网页
    UIViewController加载过程
    UIApplication相关
    实现消息转发功能(调用非自己类方法)
  • 原文地址:https://www.cnblogs.com/wdt1/p/13741835.html
Copyright © 2011-2022 走看看