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

本文探讨了如何在二叉搜索树和普通树中找到两个结点的最低公共祖先。对于二叉搜索树,从根节点开始比较即可;对于普通树,若存在指向父节点的指针,问题转化为链表公共结点;若无指针,需自顶向下遍历查找。同时介绍了两种不同的优化算法来避免重复遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到这个题要分几种情况

1、该树是一棵二叉搜索树:

    由于二叉搜索树是排序过的,位于左子树的结点都比父节点小,而位于右子树的结点都比父节点大,我们只需要从树的根节点开始和两个输入的结点进行比较。如果当前结点的值都比两个结点的值大,那么最低的共同父节点一定是在当前结点的左子树中,于是下一步遍历当前结点的左结点。如果当前结点的值都比两个节点的值小,那么最低共同父节点一定在当前结点的右子树中,于是下一步遍历当前结点的右子结点。这样在树中从上到下找到的第一个在两个输入结点的值之间的结点,就是最低公共祖先。

 

2、该树甚至连二叉树都不是,而只是普通的树,该怎么办?

(1)树的结点中有指向父节点的指针

  如果树中每个结点(除根节点之外)都有一个指向父节点的指针,这个问题可以转换成求两个链表的第一个公共结点。假设树结点中指向父节点的指针是pParent,那么从树的每一个叶结点开始都有一个由指针pParent串起来的链表,这些链表的尾指针都是树的根节点。输入两结点,那么这两个结点位于两个链表上,它们的最低公共祖先刚好就是这两个链表的第一个公共结点。比如输入的两个结点分别为F和H,那么F在链表F->D->B->A上,而H在链表H->E->B->A上,这两个链表的第一个交点B刚好也是它们最低公共祖先

(2)该树中没有指向父节点的指针

  <1>所谓两个结点的公共祖先,指的是这两个结点都出现在某个结点的子树中,我们可以从根节点开始遍历一棵树,每遍历到一个结点时,判断两个输入结点是不是在它的子树中。如果在子树中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值