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

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

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

心路历程:

1、在做这道题的过程中,慢慢对二叉树的递归和回溯,算是有了更加深入的理解,极简数据的调试,找到了递归回溯过程中,

增加isFound的的作用所在,没有加时,会有什么影响等等,都在代码里面注释清楚了。

2、另一个注意点,就是记录递归回溯的路径的数据结构不要用LinkedList,会导致超时异常,我换上ArrayList就好了,这个是要注意的!

解题思路:

1、使用前序遍历二叉树,找到对应的path;

2、再通过for循环找出path里面的公共节点就可以了。

import java.util.*;


public class Solution {
    boolean isFound = false;
    /**
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
    public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
        ArrayList<Integer> path1 = new ArrayList<>();
        ArrayList<Integer> path2 = new ArrayList<>();
        isFound = false;
        dfs(root, o1, path1);
        isFound = false;
        dfs(root, o2, path2);

        int res = 0;
        for(int i=0; i<path1.size() && i<path2.size(); i++){
            int i1 = path1.get(i);
            int i2 = path2.get(i);
            if(i1==i2) {
                res = i1;
            } else {
                break;
            }
        }

        return res;
    }

    /**
     * 这里我发现用LinkedList记录path会有异常,算法跑不过
     * 要用ArrayList,有可能大数据的时候,LinkedList消耗的空间,
     * 或者链接到了别到地方导致异常了
     */
    public void dfs(TreeNode root, int target, ArrayList<Integer> path) {
        if(root == null) {
            return;
        }
        //这里进来的时候,也要判断是否已经找到了,
        //不然又会加入新的未被递归遍历过的值
        if(isFound) {
            return;  
        }
        // visit T
        path.add(root.val);
        if(root.val  == target) {
            isFound = true;
            return;
        }

        dfs(root.left, target, path);
        dfs(root.right, target, path);

        // 这里递归回溯回父节点的时候,判断isFound,
        // 不判断,即使找到了,还是会被一个个删除
        if(isFound) {
            return;
        }
        path.remove(path.size()-1);
    }
}
全部评论

相关推荐

06-04 17:59
已编辑
长江大学 Java
点赞 评论 收藏
分享
重生我想学测开:嵌入式的问题,我准备入行京东外卖了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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