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

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

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

思路

使用深度优先遍历,寻找目标值,并在找到目标节点之前,创建两个集合,将每次遇到的值加入集合中当两个节点都找到时,比较寻找两个节点途中产生的节点值集合,返回最后同的节点值

当遍历左右子树后还是存在有节点未找到时,需要回溯,并删除相应集合中的当前节点值

代码

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
        * 创建两个集合,用于装下深度遍历的节点值
        */
    List<Integer> o1List = new ArrayList<>();
    List<Integer> o2List = new ArrayList<>();
    /**
     * 设置两个全局标记用来标记该节点是否找到
     */
    boolean o1Flag = false;
    boolean o2Flag = false;

    /**
     * @param root TreeNode类
     * @param o1   int整型
     * @param o2   int整型
     * @return int整型
     */
    public int lowestCommonAncestor(TreeNode root, int o1, int o2) {
        DFS(root, o1, o2);
        int i = 0;
        int j = 0;
        while (true) {
            // 如果i与j任意一个值大于对应的集合长度,直接返回
            if (i > o1List.size() - 1) {
                return o1List.get(i - 1);
            }
            if (j > o2List.size() - 1) {
                return o2List.get(j - 1);
            }
            if (o1List.get(i).equals(o2List.get(j))) {
                i++;
                j++;
            } else {
                return o1List.get(i - 1);
            }
        }
    }

    /**
     * 深度遍历二叉树。找到两个目标节点时结束遍历
     *
     * @param root 根节点
     * @param o1   目标值1
     * @param o2   目标值2
     * @apiNote
     * @since 2023/1/4 22:29
     */

    public void DFS(TreeNode root, int o1, int o2) {

        if (root != null) {
            // 检查节点是否寻找完毕
            if (o1Flag && o2Flag) {
                return;
            }
            // 如果目标节点未被找到,将当前节点值加入集合
            if (!o1Flag) {
                o1List.add(root.val);
            }
            if (!o2Flag) {
                o2List.add(root.val);
            }
            // 判断当前节点值是否符合条件
            if (root.val == o1) {
                o1Flag = true;
            }
            if (root.val == o2) {
                o2Flag = true;
            }
            // 递归的调用方法遍历左子树
            DFS(root.left, o1, o2);
            // 递归的调用方法遍历右子树
            DFS(root.right, o1, o2);
            int length;
            // 删去当前节点加入的值
            if (!o1Flag) {
                length = o1List.size();
                o1List.remove(length - 1);
            }
            if (!o2Flag) {
                length = o2List.size();
                o2List.remove(length - 1);
            }
        }

    }
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务