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

本文深入探讨了在不同类型的树(二叉排序树、普通树、二叉树和普通二叉树)中寻找给定两个节点的最低公共祖先的JAVA解决方案。详细分析了每种树形结构下的策略,包括排序二叉树的中间值判断,普通树利用父节点指针对链表公共节点的搜索,以及无父节点指针的二叉树和普通树中利用回溯寻找路径的方法。文章还提供了树节点的定义和核心代码片段。
摘要由CSDN通过智能技术生成

最近看了一道面试题目,觉得很有意思,而且常常被问到,今天综合归纳了一下这道题目,并给出了各种变形题目,附上JAVA版的程序解答。

题目是这样的:寻找二叉树的最低公共祖先?(其中隐含着一个盲点:树是什么树?排序二叉树、普通二叉树、或者不是二叉树?)所以要分别考虑哈各种情况哈

形式一:当树为二叉排序树,如何寻找给定两节点的最低公共祖先?

形式二:当树为普通树,但每个节点中有指针指向其父节点,如何寻找?

形式三:当树为二叉树,每个节点仅有左右孩子指针,如何寻找?

形式四:当树为普通树,每个节点仅有左右孩子指针,如何寻找?


分析:此题设计考点很多,单细细分析下来,都可以逐渐解决的(为了更加通用化,在对树的定义上加了泛型):

(1)排序二叉树

排序二叉树相对简单,根据排序二叉树的特点,根节点的左孩子永远小于根节点的值,右孩子的值永远大于根节点的值,对给定节点Node1、Node2,要找其最低公共祖先=>实际上就是寻找一个节点,使得节点的值位于两个节点的值中间,即原问题转化为二叉树的遍历问题

     5   ======排序二叉树
    / \
   3   7
     / \       / \
 2  4 6  9
/  
1   
树的节点定义如下:

class TreeNode<T> {
	T data;
	TreeNode<T> leftChildren;
	TreeNode<T> rightChildren;
	public TreeNode(T data){
		this.data=data;
		this.leftChildren=null;   //此处是我的强迫症
		this.rightChildren=null;
	}
}
实现寻找父节点的核心代码如下:

	//通过遍历二叉排序树即可完成查找
	private static TreeNode<Character> findParent(TreeNode<Character> root,
			TreeNode<Character> node_1, TreeNode<Character> node_2) {
		
		if(root==null)
			return null;
		if(root.da
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值