zoukankan      html  css  js  c++  java
  • Leecode no.236 二叉树的最近公共祖先

    package tree;

    import sun.reflect.generics.tree.Tree;

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;

    /**
    * 236. 二叉树的最近公共祖先
    * 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
    *
    * 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。
    *
    * @author Tang
    * @date 2021/7/22
    */
    public class LowestCommonAncestor2 {

    Map<TreeNode, TreeNode> parentMap = new HashMap<>();

    /**
    * 纪录每个节点的父节点,记录到一个map中
    * 遍历p的父节点 存成一个List
    * 遍历q的父节点 判断是否在p的list中存在
    *
    * @param root
    * @param p
    * @param q
    * @return
    */
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    preSearch(root);
    List<TreeNode> pParentList = new ArrayList<>();
    pParentList.add(p);
    TreeNode pParent = p;
    while(true){
    pParent = parentMap.get(pParent);
    if(pParent == null){
    break;
    }
    pParentList.add(pParent);
    }
    TreeNode qParent = q;
    while (true){
    if(pParentList.contains(qParent)) {
    return qParent;
    }
    qParent = parentMap.get(qParent);
    if(qParent == null){
    break;
    }
    }
    return null;


    }

    /**
    * 前序遍历 生成父节点Map
    *
    * @param node
    */
    private void preSearch(TreeNode node){
    if(node == null) {
    return;
    }
    if(node.left != null) {
    parentMap.put(node.left, node);
    }
    if(node.right != null) {
    parentMap.put(node.right, node);
    }
    preSearch(node.left);
    preSearch(node.right);
    }

    public static void main(String[] args) {


    }








    }
  • 相关阅读:
    python中几种数据类型常用的方法
    WSGI
    从开学到初赛的一些个人总结
    CSP-S2020 浙江 游记
    CF1416D Graph and Queries
    单次期望 O(1) 的RMQ
    P3177 [HAOI2015]树上染色
    CF835F Roads in the Kingdom/P1399 [NOI2013]快餐店
    P4381 [IOI2008]Island
    P5655 基础数论函数练习题
  • 原文地址:https://www.cnblogs.com/ttaall/p/15043717.html
Copyright © 2011-2022 走看看