二分查找,二叉搜索树寻找最近祖先均是典型分治问题,把原问题分成三部分考虑,递归实现简单,迭代实现也比较简单,里面蕴含了一些从从递归到迭代的技巧,注意这里没有使用模拟栈技术。

深究其原因是,这一类型的递归,每次查找丢弃了一半,递归到底部就找到了问题的解,搜索到最小子问题就解决了问题,类似于分支限界剪枝,剪到最后就是问题的解,不需要一层一层的回退,也就没有必要使用栈来恢复现场。

二分查找,递归和迭代


# 注意递归的返回值,递归的要返回的话,要前后一致,或者直接基于某一层考虑,把递归看成结果
def binary_Serach_recursive(arr,left,right,target):middle = (left + right) // 2# 递归出口if left > right :return(-1)if arr[middle] == target:return(middle)elif arr[middle] < target:# 这里没有return的话,结果就没法return出来return binary_Serach_recursive(arr,middle+1,right,target)else:return binary_Serach_recursive(arr,left,middle-1,target)# 递归转换为迭代实现:可以看出上述的递归就是,left,right对应一个子问题,left,right两个指针相互逼近的过程
# 迭代实现时,也不断逼近两个指针,即可迭代实现递归
def binary_Serach_iterative(arr,target):left = 0right = len(arr)-1# 循环体条件while left <= right:middle = (left + right) // 2if arr[middle] == target:return middleelif arr[middle] < target:left = middle +1else:right = middle -1return -1

二叉搜索树寻找最近祖先,递归和迭代

def lowestCommonAncestor(self, root, p, q):if root.data < p and root.data < q:return self.lowestCommonAncestor(root.right, p, q)elif root.data > p and root.data > q:return self.lowestCommonAncestor(root.left, p, q)else:return root        # 树形结构,是使用一个指针就可以描述一个子问题,指针对应的是子问题的选择,迭代时更新
# 树形指针就行了,出口就是找到了祖先,或者树形指针指向None# 这里是树形指针的一种用方法,是把递归转化为迭代的一种常用方法
def lowestCommonAncestorRecursion(self, root, p, q):pointer = rootwhile pointer:if pointer.data < p and pointer.data < q:pointer = pointer.rightelif pointer.data > p and pointer.data > q:pointer = pointer.left        else:return pointer 

树形结构:从二分查找,二叉搜索树寻找最近祖先,从递归到迭代,实现技巧总结相关推荐

  1. leetcode 701 二叉搜索树的插入操作 C++ 递归和迭代

    迭代 class Solution {public:TreeNode* insertIntoBST(TreeNode* root, int val) {if(!root) return new Tre ...

  2. 经典算法——二叉搜索树的公共祖先节点

    介绍 二叉搜索树的公共祖先节点是指:对于给定的两个节点p.q,向上寻找离二者最近的公共节点. public class Node<T extends Comparable<T>> ...

  3. 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

    1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...

  4. 二叉搜索树的最近祖先

    235. Lowest Common Ancestor of a Binary Search Tree 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:& ...

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

    二叉树的定义: # Definition for a binary tree node. class TreeNode:def __init__(self, x):self.val = xself.l ...

  6. 二叉搜索树最近公共祖先二叉树最近公共祖先

    什么是二叉搜索树? 对于二叉树的任意一个节点n: (1)其左子树下的每个节点的值都小于节点n的值: (2)其左子树下的每个节点的值都大于节点n的值: 思路与算法 从根节点开始遍历: 如果当前节点的值大 ...

  7. 【化解数据结构】详解树结构,并实现二叉搜索树

  8. 二叉搜索树-php实现 插入删除查找等操作

    二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的 ...

  9. C++实现二叉搜索树的查找(附完整源码)

    二叉搜索树的查找 二叉搜索树的查找算法 二叉搜索树的查找算法完整源码 二叉搜索树的查找算法 在二叉搜索树 b 中查找 x 的过程为: 若 b 是空树,则搜索失败,否则: 若 x 等于 b 的根节点的数 ...

最新文章

  1. 2022,人工智能开启未来新密码
  2. 刷脸,带来了方便,也带来了隐患,不可不防呀!
  3. @classmethod和@staticmethod对初学者的意义? [重复]
  4. 分区供水条件口诀_口诀记忆 | 消防给水和消火栓系统的“月检”(重点学习)...
  5. android 自动挂断,[转]android 来电自动接听和自动挂断
  6. 用python祝福父亲节_父亲节给爸爸的祝福语微信48条
  7. python import logging日志
  8. windows获取IP和MAC地址【Qt】
  9. 【PTA】浙大版《C语言程序设计(第3版)》题目集
  10. 数据协作如何解决大数据的大问题
  11. 使用timerfd实现定时器功能
  12. 直播源 列表 转换 php,Telelist直播源制作与格式转换工具 V2.4.1下载 制作XSPF、DPL、M3U等播放列表格式...
  13. Unity3D最全性能优化参考手册(渲染、代码、UI)
  14. cadence allegro - 焊盘命名规则 -unfinished -unfinished-unfinished
  15. 爬取西刺代理的免费IP
  16. 中兴ZTE:五年工作感想
  17. 长视频优化:如何高效减少转码耗时
  18. spyder 更改默认工作目录的最优方法
  19. 计算机cpu的字母,电脑处理器后面的字母你认识几个?不认识跟我来学学(intel篇)...
  20. 【论文翻译】HCGN:面向集体分类的异构图卷积网络深度学习模型

热门文章

  1. python编写递归函数和非递归函数、输出斐波那契数列_python 入门之斐波那契数列递归表达式算法和非递归算法...
  2. samba权限跟linux权限,linux之samba与linux权限
  3. 双通道和单通道区别_实测内存通道的区别:单通道比双通道内存更有优势?
  4. mysql+phpMyAdmin错误解决:bug #4813 MySQL 5.7.6 and the Users menu tab
  5. linux:Too Many Open Files(打开的文件过多)
  6. Burst trie(爆炸式字典树)解读
  7. 更改tomcat的request编码方式
  8. php写简单接口_使用PHP如何编写简单的App接口
  9. codematic2连接mysql失败_codematic2.rar
  10. 实验结果报告与实验总结_教科版科学四年级上册实验报告