一,问题描述

请构造一棵二叉查找树,并给定两个结点,请找出这两个结点的最低公共祖先结点。

这里假设二叉查找树中的结点的权值存储是整型数字(见代码中的BinaryNode内部类),最低公共祖先结点如下:结点5 和 结点12 的最低公共祖先结点是结点10

二,实现思路

假设给定的两个结点的权值分别为 node1 和 node2

如果根的权值处于 node1 和 node2 之间,则根就是它们的最低公共祖先结点

如果根的权值比 node1 和 node2 都大,则它们的最低公共祖先结点在根的左子树中

如果根的权值比 node1 和 node2 都小,则它们的最低公共祖先结点在根的右子树中

因此,这可以用递归来实现。

三,代码实现

首先得构造一棵二叉查找树。具体构造可参考:二叉树的构造

构造好之后,调用lowestCommonParentNode方法即可找出最低公共祖先结点的权值。

public class LowCommonNode {private class BinaryNode{BinaryNode left;BinaryNode right;int ele;public BinaryNode(int ele) {this.ele = ele;left = right = null;}}private BinaryNode root;private void buildTree(int[] arr){for (int i : arr) {insert(i);}}private void insert(int ele){root = insert(root, ele);}private BinaryNode insert(BinaryNode root, int ele){if(root == null)return new BinaryNode(ele);if(root.ele > ele)//insert leftroot.left = insert(root.left, ele);else if(root.ele < ele)root.right = insert(root.right, ele);elseroot.left = insert(root.left, ele);//相等时,放在左边return root;}/*** 求解二叉查找树中  node1 和 node2 代表的节点的 最低公共祖先结点* 首先让node1总是代表权值较小的那个结点.* 对于二叉查找树而言:* 如果根的权值处于 node1 和 node2 之间,则根就是它们的最低公共祖先结点* 如果根的权值比 node1 和 node2 都大,则它们的最低公共祖先结点在根的左子树中* 如果根的权值比 node1 和 node2 都小,则它们的最低公共祖先结点在根的右子树中*/public int lowestCommonParentNode(BinaryNode root, int node1, int node2){if(node1 > node2){int tmp = node1;node1 = node2;node2 = tmp;}assert node1 < node2;if(root == null)throw new IllegalArgumentException(" neither node1 nor node2 contains in binary search tree ");if(root.ele > node1 && root.ele < node2)return root.ele;if(root.ele > node1 && root.ele > node2)//if(root.ele > node2)//在左子树中查找最低公共祖先结点return lowestCommonParentNode(root.left, node1, node2);else//root.ele < node1//在右子树中查找最低公共祖先结点return lowestCommonParentNode(root.right, node1, node2);}//hapjin testpublic static void main(String[] args) {LowCommonNode lcn = new LowCommonNode();int[] arr = {20,10,30,5,15,25,40,12,18};lcn.buildTree(arr);//build a binary search tree// node1 and node2 should exist in arr,or will throw IllegalArgumentExceptionint node1 = 5;int node2 = 12;//should build Tree before invoke lowestCommonParentNode
        System.out.println(lcn.lowestCommonParentNode(lcn.root, node1, node2));}
}

四,参考资料

求解二叉树中两个结点的最低公共父结点

二叉树的构造

转载于:https://www.cnblogs.com/hapjin/p/5770596.html

求解二叉查找树中的最低公共祖先结点相关推荐

  1. 1143 Lowest Common Ancestor (30 分)【难度: 中 / 知识点: 最低公共祖先 未完成】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805343727501312

  2. 树中两个结点的最低公共祖先

    题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数 ...

  3. 寻找树中两个结点的最低公共祖先

    寻找树中两个结点的最低公共祖先 Q:在树中寻找两个结点的最低公共祖先,是什么意思呢? A:树是由根节点衍生左右孩子继续衍生左右孩子的左右孩子.所以呢树中的两个结点是一定拥有最低公共祖先(这两个结点Q: ...

  4. 有一个1亿结点的树,已知两个结点, 求它们的最低公共祖先!

    对该问题,分为如下几种情形讨论: 情形一: 假如该树为二叉树,并且是二叉搜索树, 依据二叉搜索树是排过序的, 我们只需要从树的根结点开始,逐级往下,和两个输入的结点进行比较. 如果当前结点的值比两个结 ...

  5. 50:树中两个结点的最低公共祖先

    题目:求树中两个结点的最低公共祖先,此树不是二叉树,并且没有指向父节点的指针. 树的结点定义 private static class TreeNode {int val;List<TreeNo ...

  6. C++实现二叉树相关问题(先序遍历,中序遍历,后序遍历,层序遍历,搜索二叉树、平衡二叉树、满二叉树、完全二叉树的判断,最低公共祖先,二叉树的序列化和反序列化)

    目录 题目一 二叉树递归和非递归遍历 题目二 如何完成二叉树的宽度(也叫层序)遍历(常见题目:求一棵二叉树的宽度) 题目四 如何判断一棵二叉树是搜索二叉树(BST)? 题目四 如何判断一棵二叉树是平衡 ...

  7. PAT甲级1151 LCA in a Binary Tree (30 分):[C++题解]LCA、最低公共祖先、哈希表映射

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 和下面这道题几乎是同一题:PAT甲级1143 Lowest Common Ancestor (30 分):[C++题解]LCA.最低 ...

  8. PAT甲级1143 Lowest Common Ancestor (30 分):[C++题解]LCA、最低公共祖先

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:二叉搜索树的中序遍历是隐含给定的,它的中序遍历就是从小到大排列. 所以这道题先是根据给定的前序遍历和中序遍历,建树. 建树的时候需要用 ...

  9. 二叉树两个结点的最低公共父结点 【微软面试100题 第七十五题】

    题目要求: 输入二叉树中的两个结点,输出这两个及诶单在数中最低的共同父结点. 题目分析: 还有一种情况:如果输入的两个结点中有一个或两个结点不在二叉树中,则输出没有共同父结点: 因此,可以在程序中定义 ...

  10. 由浅入深:求给定两个树节点的最低公共祖先(二叉树、普通树结构)JAVA实现

    最近看了一道面试题目,觉得很有意思,而且常常被问到,今天综合归纳了一下这道题目,并给出了各种变形题目,附上JAVA版的程序解答. 题目是这样的:寻找二叉树的最低公共祖先?(其中隐含着一个盲点:树是什么 ...

最新文章

  1. Js高设笔记1-2章 defer and async
  2. python中requests库的用途-数据爬虫(三):python中requests库使用方法详解
  3. java comp env 区别_加和不加java:comp/env/前缀有什么区别?
  4. Android线程间通信之handler
  5. HDU 3046 Pleasant sheep and big big wolf 最小割
  6. 打开word2016总是出现很抱歉,此功能看似中断需要修复。。问题解决办法
  7. C++ STL string与算法
  8. mysql explain 派生表_MySQL explain 查询计划结果集学习笔记
  9. 计算机网络知识点脑图 王道 考研
  10. 任正非《以客户为中心》
  11. Android开发 UI布局
  12. iPhone屏幕尺寸、statusBar、navigationBar、tabBar高度对比
  13. ONF组织的SDN架构文档——四个架构(三/一)
  14. 名帖288 董其昌 行书《岳阳楼记》
  15. 爆文标题怎么写,分享四个吸睛标题的万能套路写法,新手速看!
  16. (转载)虚幻引擎3--【UnrealScript教程】章节一:11.Struct结构体
  17. 如何更改vmware的网络模式
  18. 关于经济寒冬找工作为什么这么难?
  19. 2023年破产重整投资策略研究报告
  20. 在 Anaconda3 5.0.0 中安装 Plot.ly Dash

热门文章

  1. php访问属性两种方式,使用PHP访问对象的属性
  2. (省赛系列——团队第三场)
  3. Code::Blocks代码自动提示设置及常用快捷键 .
  4. pyqt一个text实时显示另一个text的内容_python:基于tkinter打造的股票实时监控声音报警器! 自动监控,声音警报...
  5. 【牛客练习赛57:D】回文串(回文树求前/后缀最长回文子串)
  6. 如何在信用卡反欺诈检测中使用人工智能和机器学习
  7. ORBSLAM2在ubuntu20.04上运行,实时单目摄像头(适用高版本的PCL,OpenCV4.2.0等)
  8. C/C++[ w1785]字符串连接
  9. 翻译:生产中的机器学习:为什么你应该关心数据和概念漂移
  10. 算法:判断对称树 101. Symmetric Tree