题解 | #在二叉树中找到两个节点的最近公共祖先#
在二叉树中找到两个节点的最近公共祖先
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; } }#二叉树##回溯算法##二叉树路径#