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的主要内容,如果未能解决你的问题,请参考以下文章