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

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

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

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 o1 int整型
     * @param o2 int整型
     * @return int整型
     */
    public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
        // write code here
        // 转换为找路径
        //求根节点到两个节点的路径
        ArrayList<Integer> path_p = new ArrayList<>();
        ArrayList<Integer> path_q = new ArrayList<>();

        getPath(root, o1, path_p);
        getPath(root, o2, path_q);


        int res = 0;
        //比较两个路径,找到第一个不同的点
        for (int i = 0; i < path_p.size() && i < path_q.size(); i++) {
            int x = path_p.get(i);
            int y = path_q.get(i);
            //最后一个相同的节点就是最近公共祖先
            if (x == y)
                res = path_p.get(i);
            else
                break;
        }
        return res;
    }
    //求得根节点到目标节点的路径
    public boolean getPath(TreeNode root, int target, ArrayList<Integer> path) {
        // 用回溯来找路径
        if (root == null) return false;
        // 添加
        path.add(root.val);
        // 执行
        if (root.val == target) {
            return true;
        }
        if (getPath(root.left, target, path) || getPath(root.right, target, path)) {
            return true;
        }
        // 回溯
        path.remove(path.size()-1);

        return false;

    }
}

#二叉树##回溯算法##二叉树路径#
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务