千家信息网

python二叉树的最近公共祖先如何理解

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章将为大家详细讲解有关python二叉树的最近公共祖先如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。给定一个二叉树, 找到该树中两个指定
千家信息网最后更新 2025年01月23日python二叉树的最近公共祖先如何理解

这篇文章将为大家详细讲解有关python二叉树的最近公共祖先如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。"

例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]

示例 1:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。

示例 2:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4

答案:

1public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
2 if (root == null || root == p || root == q)
3 return root;
4 TreeNode left = lowestCommonAncestor(root.left, p, q);
5 TreeNode right = lowestCommonAncestor(root.right, p, q);
6 return left == null ? right : right == null ? left : root;
7}

解析:

通过递归的方式,分别从他的左右两个子节点往下找,如果都不为空,说明他们最近的公共祖先节点肯定是当前root节点,如果有一个为空,说明他们最近的公共祖先节点在另一个在子节点上。这种解法和DFS很像,先从最左端的叶子节点开始找起,然后再网上回溯,下面再来看一种解法

 1public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
2 Map parent = new HashMap<>();
3 Deque stack = new ArrayDeque<>();
4 parent.put(root, null);
5 stack.push(root);
6 while (!parent.containsKey(p) || !parent.containsKey(q)) {
7 TreeNode node = stack.pop();
8 if (node.right != null) {
9 parent.put(node.right, node);
10 stack.push(node.right);
11 }
12 if (node.left != null) {
13 parent.put(node.left, node);
14 stack.push(node.left);
15 }
16 }
17 Set ancestors = new HashSet<>();
18 while (p != null) {
19 ancestors.add(p);
20 p = parent.get(p);
21 }
22 while (!ancestors.contains(q))
23 q = parent.get(q);
24 return q;
25}

Map中key记录的是当前节点,value记录的是当前节点的父节点,第一个while循环使用的是DFS,直到找到p和q节点为止,第二个while循环会把p节点以及他的的父节点,以及父节点的父节点……都加入到ancestors集合中,第3个while循环不断的取出q节点和他的父节点以及父节点的父节点……直到在ancestors中能找到为止,找到的那个正好即是p的祖先节点也同时是q的祖先节点,同时也是最近的。

关于python二叉树的最近公共祖先如何理解就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

节点 祖先 两个 循环 内容 同时 文章 更多 知识 示例 篇文章 结点 解法 输入 不错 循环不断 不断 叶子 尽可能 方式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 怎么删除网络安全向导了 软测什么情况下用到数据库 呼伦贝尔的互联网科技的公司 网络安全和保密职责 审计局 网络安全 linux系统 证券公司软件开发发展 公司服务器管理人员 添加要管理的其他服务器 湖州软件开发大概多少价格 城市大脑网络安全国家背景材料 阿里云服务器首次使用感受总结 阿拉德之怒虚拟机服务器 国有企业 旗下软件开发公司 数据库创建低版本数据库 战地3 中国服务器 服务数据库已锁定磁盘 java处理数据库日期格式 潍坊国家网络安全 冒险岛游戏数据库 软件开发 功能如何量化 工程软件开发就业前景 学校图书馆数据库资源用不了 vb数据库的添加数据类型 互联网科技大会成果 数据库安全系统解决方案 北京敦敏网络技术有限公司 sql语句删除数据库代码 软件开发公司条例 如何快速删除手机无效数据库 云橙网络技术有限公司
0