这种题非常简单,总之就是两个字,先层序遍历,目的是记录节点的值,并记下两个节点的位置,找到后结束遍历,上溯查找即可,所谓上溯,就是除以二变成父节点的下标,直到两个相当,此时这个坐标就是最近公共节点的值。
代码如下:
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @param o1 int整型
* @param o2 int整型
* @return int整型
*/
public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
// write code here
List<Integer> list = new ArrayList<>();
List<TreeNode> level = new LinkedList<>();
level.add(root);
int cnt = 0;
int index1 = 0;
int index2 = 0;
while(cnt<2){
for(TreeNode node:level){
if(node!=null){
list.add(node.val);
}else{
list.add(null);
}
if(node!=null&&(node.val==o1||node.val==o2)){
if(node.val==o1){
index1 = list.size();
}else{
index2 = list.size();
}
cnt++;
}
}
List<TreeNode> tempLevel = new LinkedList<>();
for(TreeNode node:level){
if(node==null){
tempLevel.add(null);
tempLevel.add(null);
}else {
tempLevel.add(node.left);
tempLevel.add(node.right);
}
}
level = tempLevel;
}
// System.out.println(list+"");
while(index1!=index2){
if(index1>index2){
index1 = index1/2;
}else{
index2 = index2/2;
}
}
return list.get(index1-1);
}
}
京公网安备 11010502036488号