1. 程式人生 > 其它 >Leecode no.236 二叉樹的最近公共祖先

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) {


}








}