推广 热搜: 行业  机械  设备    经纪  教师  系统  参数    蒸汽 

树:寻找最近的公共祖先

   日期:2024-11-07     移动:http://yishengsujiao.xhstdz.com/quote/3488.html

前引

树:寻找最近的公共祖先

树可以分为好几种:普通树,二叉树(二叉链,三叉链,二叉搜索树等等,今天我们,讨论的的问题可就和就几种树有关。

我们先易后难,讨论二叉搜索树! 

且所有的输入满足

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的树中

由于二叉搜索树是有序的,左子树全部小于根节点,右子树全部大于根节点。

倘若我们要查找p,q节点的公共祖先。其中根节点的值等于p节点的值或者等于q节点的值,根就是我们要查找的公共祖先。

例如:p为5,q为2;当我们查找到2的时候,就可以停止;由于我们从树根节点遍历下来,且p,q节点均存在于树中,我们就可以认为p一定存在于q的子树中。

当根节点的值大于p和q的值时,我们就可以只遍历左子树, 同样,当根节点的值小于p和q的值时,我们就可以只遍历右子树

倘若一个比根节点的值大,一个比根节点的值要小,则肯定一个在左子树,一个在右子树,当前根节点就是我们要找的最近公共祖先 。

  • 当根节点的值大于p和q的值时,我们就可以只遍历左子树
  • 当根节点的值小于p和q的值时,我们就可以只遍历右子树
  • 否则,当前根节点就是我们要找的最近公共祖先 。

下面看我们的代码实现

 

什么是三叉链结构呢

就是每个子结点都有一个指针,指向父节点。

所以三叉链结构,解决这个问题十分简单。我们只需要在树中找到对应的节点,在通过指向父节点的指针找到最近公共祖先。其实,这有点在两个链表中寻找公共节点的意思。

 由于题库中没有找到这个题,代码就不实现了。

二叉树和普通树都没有什么特点,所以我们只需要遍历树中的每个节点,倘若我们要查找p,q节点的公共祖先。其中根节点的值等于p节点的值或者等于q节点的值,根就是我们要查找的公共祖先。倘若一个比根节点的值大,一个比根节点的值要小,则肯定一个在左子树,一个在右子树,当前根节点就是我们要找的最近公共祖先 。

 

到这里,我们本文所讲的寻找公共祖先篇已经结束了。

但是在最后一普通树、二叉树一篇中,我们可以看一下时间复杂度是多少呢? O(N?其实我们遍历一棵树,时间复杂度也就是O(N;但是我们做了许多重复的工作

我们再看一下这张图

比如我们要查找的节点为7 和4;我们首先判断以3为根节点的树,遍历完左子树和右子树,发现全在左子树;在判断以5为根节点的树,遍历完左子树和右子树,发现全在右子树。(其实到这里我们已经发现了,6 2  7  4 我们已经遍历了两遍) 直到我们找到7和4.

由于做了重复的工作   第一个N第二次N/2。。。。。。我们可以认为是N^2了。

那可以改善吗

我们可以借鉴三叉链方法:空间换时间,用容器将路径保存,再寻找最近的公共节点。

下面给出代码实现

效率有所提高的代码实现

 

本篇博文到这里就结束了,谢谢大家的观看

你们的 【三连】 是给Qyuan最大的肯定

↓          ↓           ↓

:如果本篇博客有任何错误和建议,欢迎伙伴们留言,你快说句话啊

如果需要练习的小伙伴,可以打开下方链接

二叉搜索树的最近公共祖先

https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof/

二叉树的最近公共祖先

本文地址:http://nhjcxspj.xhstdz.com/quote/3488.html    物流园资讯网 http://nhjcxspj.xhstdz.com/ , 查看更多

特别提示:本信息由相关企业自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


0相关评论
相关行业动态
推荐行业动态
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号