题解 | #在二叉树中找到两个节点的最近公共祖先#
在二叉树中找到两个节点的最近公共祖先
http://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116
public class Solution {
/**
*
* @param root TreeNode类
* @param o1 int整型
* @param o2 int整型
* @return int整型
*/
public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
// 记录有子元素的节点
ArrayList<treenode> list = getNode(root);
for(int i=list.size()-1; i>=0;i--){
TreeNode node = list.get(i);
hasO1 = false;
hasO2 = false;
preOrder(node, o1, o2);
if(hasO1 && hasO2){
return node.val;
}
}
return -1;
}
boolean hasO1 = false;
boolean hasO2 = false;
public void preOrder(TreeNode root, int o1, int o2){
if(root!=null){
if(root.val == o1) hasO1 = true;
if(root.val == o2) hasO2 = true;
preOrder(root.left, o1, o2);
preOrder(root.right, o1, o2);
}
}
public ArrayList<treenode> getNode(TreeNode root){
ArrayList<treenode> list = new ArrayList<>();
ArrayList<treenode> queue = new ArrayList<>();
queue.add(root);
while(queue.size()!=0){
TreeNode node = queue.remove(0);
if(node.left!=null || node.right!=null){
list.add(node);
}
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
}
return list;
}
}思路为找到所有的具有子节点的节点,然后从后往前进行遍历查找。对于每个父节点而言,我们可以进行先序遍历,然后判断是否o1和o2的值同时存在即可,如果同时存在,那么直接返回该节点的值即可。
涉及知识点,层序遍历。

