题解 | #第一个只出现一次的字符#

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

http://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116

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) {
        //map用于存放<子节点的值,父节点的值>
        Map<Integer,Integer> parent = new HashMap<>();
        //队列用于遍历所有节点
        Queue<TreeNode> que = new LinkedList<>();
        //给root一个初始值,因为没有父节点
        parent.put(root.val,Integer.MIN_VALUE);
        //将root添加到队列,开始遍历
        que.add(root);

        //遍历树,直到找到o1和o2
        while(!parent.containsKey(o1) || !parent.containsKey(o2)){
            //先进先出,从队列中第一个节点开始,依次出队遍历左右子树
            TreeNode node = que.poll();
            //若节点的左孩子非空,则记录其与父节点的值到map,即<左孩子值,当前节点值>
            //同时将左孩子添加到队列准备遍历
            if(node.left != null){
                parent.put(node.left.val,node.val);
                que.add(node.left);
            }
            //右孩子同左孩子
            if(node.right!=null){
                parent.put(node.right.val,node.val);
                que.add(node.right);
            }
        }
        //从map中查询,并记录o1的所有父节点和祖先节点,添加到set中
        Set<Integer> ancestor = new HashSet<>();
        while(parent.containsKey(o1)){
            ancestor.add(o1);
            //获取o1的父节点,继续遍历
            o1 = parent.get(o1);
        }
        //查看o1和他的祖先节点是否包含o2节点,直到找到交叉点,即为所求
        while(!ancestor.contains(o2)){
            o2 = parent.get(o2);
        }
        return o2;

    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务