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

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

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-02 14:45
bg是二本双一流硕,目标是Java后端开发岗,投暑期实习0大厂面试,只有极少的大厂测开,可能投的晚加上简历太烂加上0实习?求大佬们给个建议
程序员小白条:别去小厂,初创或者外包,尽量去中小,100-499和500-999,专门做互联网产品的,有公司自研的平台和封装的工具等等,去学习一些业务相关的,比如抽奖,积分兑换,SSO认证,风控,零售等等,目标 Java 后端开发吗?你要不考虑直接走大厂测开?如果技术不行的话,有面试你也很难过的
实习,不懂就问
点赞 评论 收藏
分享
点赞 评论 收藏
分享
Gaynes:查看图片
点赞 评论 收藏
分享
nus2201602...:兄弟,你这个简历撕了丢了吧,就是一坨,去找几个项目,理解项目流程,看几遍就是你的了,看看八股就去干了,多看看牛客里别人发出来的简历,对着写,你这写的啥啊,纯一坨
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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