leetcode刷题14

Posted xjtuer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode刷题14相关的知识,希望对你有一定的参考价值。

今天刷的题是LeetCode236题,是给定一个二叉树,以及二叉树中的两个节点,然后找出两个节点的最近公共祖先

上一道题我自己的解法在这道题依旧适用,即找出两节点到根节点的路径,然后遍历。

我自己的解法,当时为了找到这条路径费了很多劲儿。这道题参考了哈LeetCode的官方解答思路,说可以用父指针的方式来解决。因此这里用了一个map集合

key保存的是当前节点,value保存的是父节点

首先是一个递归遍历,找出除了根节点外的所有节点的父节点

然后是查找。具体地代码如下:

import LeetcodePart6.TreeNode;

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

public class LowestCommonAncestor_236_middle {
    private static Map<TreeNode,TreeNode> parent;
    public static TreeNode solution(TreeNode root, TreeNode p,TreeNode q){
        parent=new HashMap<>();
        getAncestor(root);
        List<TreeNode> plist=new ArrayList<>();
        List<TreeNode> qlist=new ArrayList<>();
        plist.add(p);
        qlist.add(q);
        while (parent.get(p)!=null){
            TreeNode node=parent.get(p);
            plist.add(node);
            p=node;
        }
        while (parent.get(q)!=null){
            TreeNode node=parent.get(q);
            qlist.add(node);
            q=node;
        }
        for (int i = 0; i <plist.size() ; i++) {
            for (int j = 0; j <qlist.size() ; j++) {
                if (plist.get(i)==qlist.get(j)){
                    return plist.get(i);
                }
            }
        }
        return root;
    }
    public static void getAncestor(TreeNode root){
        if (root==null) return;
        if (root.left!=null){
            parent.put(root.left,root);
            getAncestor(root.left);
        }
        if (root.right!=null){
            parent.put(root.right,root);
            getAncestor(root.right);
        }
        return;
    }
}

 

以上是关于leetcode刷题14的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题14-简单-最长公共前缀

LeetCode刷题14-简单-最长公共前缀

LeetCode刷题(39)~丑数

LeetCode刷题面试题17.14-简单-最小k个数

LeetCode刷题面试题17.14-简单-最小k个数

Leetcode刷题Python LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色