leetcode刷题14

时间:2019-08-22
本文章向大家介绍leetcode刷题14,主要包括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;
    }
}

原文地址:https://www.cnblogs.com/cquer-xjtuer-lys/p/11393430.html