题解 | #二叉搜索树的最近公共祖先#

二叉搜索树的最近公共祖先

https://www.nowcoder.com/practice/d9820119321945f588ed6a26f0a6991f

如何获取公共祖先?

要获取公共祖先,首先要获得根节点目标节点的路径,要获取路径就需要遍历二叉树将沿途的节点加入路径数组中,而二叉搜索树是有序的,可以根据节点的大小关系选择指针遍历,而不需要循环遍历,因为路径都是从根节点出发,所以两个目标节点的最远公共祖先是根节点,最近目标节点为两个目标节点的路径中最后一个相同的节点。

参考

参考链接

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @param p int整型 
     * @param q int整型 
     * @return int整型
     */
    private ArrayList<Integer> getPath(TreeNode root, int target) {
        ArrayList<Integer> path = new ArrayList<>();
        TreeNode node = root;
        // 节点值都不同,可以用值比较判断循环
        // 二叉搜索树不需要递归找路径
        while(node.val != target) {
            path.add(node.val);
            if (target < node.val) {
                node = node.left;
            }
            else {
                node = node.right;
            }
        }
        path.add(node.val);
        return path;
    }
    public int lowestCommonAncestor (TreeNode root, int p, int q) {
        // write code here
        ArrayList<Integer> pathP = getPath(root, p);
        ArrayList<Integer> pathQ = getPath(root, q);
        int res = 0;
        for (int i = 0; i < pathP.size() && i < pathQ.size(); ++i) {
            int x = pathP.get(i);
            int y = pathQ.get(i);
            // 最后一个相同的点就是最近公共祖先
            if (x == y) {
                res = pathP.get(i);
            }
            else {
                break;
            }
		    // 如果换成以下写法就过不了最后一个用例,不知道为什么
		    // if (pathP.get(i) == pathQ.get(i)) {
                // res = pathP.get(i);
            // }
        }
        return res;
    }
}

全部评论

相关推荐

07-01 17:14
中北大学 Java
兄弟们是真是假
牛客46374834...:我在boss上投java岗从来没成功过
点赞 评论 收藏
分享
认真搞学习:28小登的建议,投算法岗不要写什么物理竞赛,互联网+,多写点项目,用什么算法做了什么。还有本科算法是不可能的开发你这个也没有项目啊
点赞 评论 收藏
分享
完美的潜伏者许愿简历...:隐藏信息被你提取出来了,暗示,这就是暗示
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务