dfs深度遍历

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

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

最近公共祖先和o1,o2有三种关系:

  1. o1,o2分别在祖先左右两侧
  2. 祖先是o1,o2在祖先左/右侧
  3. 祖先是o2,o1在祖先左/右侧

使用dfs深度遍历,如果节点为o1,o2中其中一个直接返回,如果节点超过叶子节点也返回

    public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
        return CommonAncestor(root, o1, o2).val; 
    }
    public TreeNode CommonAncestor (TreeNode root, int o1, int o2) {
        if (root == null || root.val == o1 || root.val == o2) { // 超过叶子节点,或者root为p、q中的一个直接返回
            return root;
        } 
        TreeNode left = CommonAncestor(root.left,o1,o2); // 返回左侧的p\q节点
        TreeNode right = CommonAncestor(root.right,o1,o2); // 返回右侧的p\q节点
        if (left == null) {  // 都在右侧
            return right;
        }
        if (right == null) { // 都在左侧
            return left;
        }
        return root; // 在左右两侧
    }
全部评论
这个算法有问题的,如果找到o1或者o2就返回,意思是另一个结点是它的子孙,前提是另一个结点存在的。如果另一个结点不存在呢?显然就不对了。这个算法没完全遍历所有结点,对于这道题而言是没有问题的,题目的意思是认为都存在的。
7 回复 分享
发布于 2021-02-07 11:10
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。 case通过率为0.00%
1 回复 分享
发布于 2020-10-25 11:58
这个题,python3通过的一个都没有,我真是服了牛客了***了
点赞 回复 分享
发布于 2020-11-24 00:02
太强了
点赞 回复 分享
发布于 2021-01-18 17:43
这代码编都编不过,还能排在第一……
点赞 回复 分享
发布于 2021-06-16 16:14
这思路太强了,带了个例子进去想了好一会才想明白
点赞 回复 分享
发布于 2021-07-11 23:47
这方法最好
点赞 回复 分享
发布于 2021-07-12 13:40

相关推荐

64 1 评论
分享
牛客网
牛客企业服务