题解 | #在二叉树中找到两个节点的最近公共祖先#

在二叉树中找到两个节点的最近公共祖先

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的值同时存在即可,如果同时存在,那么直接返回该节点的值即可。
涉及知识点,层序遍历。

全部评论

相关推荐

10-10 17:54
点赞 评论 收藏
分享
11-09 01:22
已编辑
东南大学 Java
高级特工穿山甲:羡慕,我秋招有家企业在茶馆组织线下面试,约我过去“喝茶详谈”😢结果我去了发现原来是人家喝茶我看着
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务