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

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

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

后续遍历大法

因为,该节点要找到最近公共祖先,所以需要先确定两个要找结点的位置,找到之后再找祖先,那么这里就自然可以想到二叉树的后序遍历,最后得到的就是最近的公共祖先。

思路:后序遍历

1.如果当前结点就是要找的结点,那么把当前结点值返回;
2.如果当前结点不是要找的结点,那么返回-1;
3.如果当前结点的左子树和右子树中,有一个返回的值不是-1,说明他们之中找到了一个结点,那么此时就要判断当前结点的值是不是要找的值,如果是,说明当前结点就是最近公共祖先,直接返回当前结点值;否则继续向上回退找祖先。
4.以上的时间复杂度是O(N),空间复杂度O(N)

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) {
        return postTreeTravel(root, o1, o2);
    }
    
    public int postTreeTravel(TreeNode root, int o1, int o2){
        if(root == null){
            return -1;
        }
        int left = postTreeTravel(root.left, o1, o2);
        int right = postTreeTravel(root.right, o1, o2);
        if(left != -1 && right != -1){
            //说明当前结点是最近公共结点
            return root.val;
        }else if(left != -1 || right != -1){
            //例外情况:当前结点既是要找的结点,也是最近公共结点
            if(o1 == root.val || o2 == root.val){
                return root.val;
            }
            //当前结点是父族结点,但不是公共结点
            return left == -1 ? right : left;
        }
        if(o1 == root.val || o2 == root.val){
            //说明找到一个结点
            return root.val;
        }
        //说明当前结点不是要找的结点
        return -1;
    }
}
全部评论

相关推荐

找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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