二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
节点 0 和节点 5 的最近公共祖先是 2。
- 从根节点开始遍历,到目标节点p,得到 [root, x,y,z,... p],将之用 list 保存
- 从根节点开始遍历,到目标节点q, 得到 [root,x,y,z,....q],将之用 list 保存
- 寻找这2个 list 的最后一个 相同 的节点,该节点就是:最近公共祖先节点
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
List<TreeNode> pNodePathList = getPath(root, p);
List<TreeNode> qNodePathList = getPath(root, q);
//寻找 pNodePathList 和 qNodePathList 中第一个不相同的 node, 该 node 就是最近的公共父节点
TreeNode ancestorNode = null;
for (int i = 0, j = 0; i < pNodePathList.size() && j < qNodePathList.size(); i++, j++) {
if (pNodePathList.get(i) == qNodePathList.get(j)) {
ancestorNode = pNodePathList.get(i);
}else {
//分叉节点,说明已经 不公共 了,不需要再继续遍历下去了
break;
}
}
return ancestorNode;
}
/**
* 记录从根节点 root 到 node 节点,所经历的所有节点(路径)
* @param root
* @param target
* @return [root, x,y,z..., target]
*/
private List<TreeNode> getPath(TreeNode root, TreeNode target) {
List<TreeNode> pathList = new LinkedList<>();
TreeNode current = root;
while (current != target) {
pathList.add(current);
if (current.val < target.val) {
//说明 node 在当前节点的 右子树
current = current.right;
} else {
//node 在当前节点的 左子树
current = current.left;
}
}
//
pathList.add(target);
return pathList;
}
}
参考:https://leetcode.cn/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof/description/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
2018-07-21 static 和 final 关键字 对实例变量赋初始值的影响