最近看了一道面试题目,觉得很有意思,而且常常被问到,今天综合归纳了一下这道题目,并给出了各种变形题目,附上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