Python实现二叉搜索树BST的方法示例


Posted in Python onJuly 30, 2019

二叉排序树(BST)又称二叉查找树、二叉搜索树

二叉排序树(Binary Sort Tree)又称二叉查找树。它或者是一棵空树;或者是具有下列性质的二叉树:

1.若左子树不空,则左子树上所有结点的值均小于根结点的值;
2.若右子树不空,则右子树上所有结点的值均大于根节点的值;
3.左、右子树也分别为二叉排序树。

  • 求树深度
  • 按序输出节点值(使用中序遍历)
  • 查询二叉搜索树中一个具有给点关键字的结点,返回该节点的位置。时间复杂度是O(h),h是树的高度。
  • 递归/迭代求最大关键字元素
  • 递归/迭代求最小关键字元素
# -*- coding:utf-8 -*-
'''
用Python实现二叉搜索树。
'''


class Node():
  def __init__(self, x):
    self.val = x
    self.left = None
    self.right = None

#求树的深度
def depth(root):
    if root is None:
      return 0
    else:
      return 1 + max(depth(root.left), depth(root.right))


#按序输出结点值(中序遍历)
def input_in_order(root):
  if root is None:
    return
  input_in_order(root.left)
  print(root.val)
  input_in_order(root.right)



#(递归实现 、迭代实现)查询二叉搜索树中一个具有给点关键字的结点,返回该节点的位置。时间复杂度是O(h),h是树的高度。
#递归实现
def search1(root, value):
  if root is None or root.val == value:
    return root
  if root.val > value:
    return search1(root.left, value)
  if root.val < value:
    return search1(root.right, value)


#迭代实现
def search2(root, value):
  while root != None and root.val != value:
    if root.val > value:
      root = root.left
    elif root.val < value:
      root = root.right
  return root


#求最大关键字元素
#迭代实现
def max_value1(root):
  while root != None and root.left != None:
    root = root.right
  if root is None:
    return root
  else:
    return root.val

#递归实现
def max_value2(root):
  if root == None:
    return root
  elif root.right == None:
    return root.val
  else:
    return max_value2(root.right)


#求最小关键字元素
#递归实现
def min_value1(root):
  if root is None:
    return root
  elif root.left is None:
    return root.val
  else:
    return min_value1(root.left)


#迭代实现
def min_value2(root):
  if root is None:
    return root
  while root.left !=None:
    root = root.left
  return root.val


if __name__ == '__main__':
  a = Node(15)
  b = Node(6)
  c = Node(18)
  d = Node(4)
  e = Node(8)
  f = Node(17)
  g = Node(20)
  h = Node(13)
  i = Node(9)
  a.left = b
  a.right = c
  b.left = d
  b.right = e
  c.left = f
  c.right = g
  e.right = h
  h.left = i
  print(search1(a, 13))
  print(search2(a,13))
  print(max_value1(a))
  print(max_value2(a))
  print(min_value1(a))
  print(min_value2(a))

ps:从二叉查找树BST中查找元素X,返回其所在结点的地址,查找的次数取决于树的高度。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用PIL缩放网络图片并保存的方法
Apr 24 Python
Python中%r和%s的详解及区别
Mar 16 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
Apr 18 Python
Django urls.py重构及参数传递详解
Jul 23 Python
Python随机函数库random的使用方法详解
Aug 21 Python
python将数组n等分的实例
Dec 02 Python
在python下实现word2vec词向量训练与加载实例
Jun 09 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
Oct 31 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
Jan 06 Python
Python+Appium实现自动抢微信红包
May 21 Python
Python爬取某拍短视频
Jun 11 Python
Python实现Hash算法
Mar 18 Python
django 基于中间件实现限制ip频繁访问过程详解
Jul 30 #Python
python3安装crypto出错及解决方法
Jul 30 #Python
Django框架组成结构、基本概念与文件功能分析
Jul 30 #Python
Python实现性能自动化测试竟然如此简单
Jul 30 #Python
python爬虫 execjs安装配置及使用
Jul 30 #Python
python 实现识别图片上的数字
Jul 30 #Python
django框架模型层功能、组成与用法分析
Jul 30 #Python
You might like
同时提取多条新闻中的文本一例
2006/10/09 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
javascript 函数调用的对象和方法
2010/07/01 Javascript
jQuery总体架构的理解分析
2011/03/07 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
bootstrap导航栏、下拉菜单、表单的简单应用实例解析
2017/01/06 Javascript
Angular2+国际化方案(ngx-translate)的示例代码
2017/08/23 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
浅析Python中将单词首字母大写的capitalize()方法
2015/05/18 Python
Python多进程分块读取超大文件的方法
2016/04/13 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
Python实现Dijkstra算法
2018/10/17 Python
python微元法计算函数曲线长度的方法
2018/11/08 Python
python 整数越界问题详解
2019/06/27 Python
Python Django 封装分页成通用的模块详解
2019/08/21 Python
Django中的AutoField字段使用
2020/05/18 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
Python selenium爬取微信公众号文章代码详解
2020/08/12 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
python 利用jieba.analyse进行 关键词提取
2020/12/17 Python
html5 移动端视频video的android兼容(去除播放控件、全屏)
2020/03/26 HTML / CSS
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
描述内存分配方式以及它们的区别
2016/10/15 面试题
土木工程个人自荐信范文
2013/11/30 职场文书
银行求职推荐信范文
2013/11/30 职场文书
文明村创建实施方案
2014/03/27 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
环卫工人先进事迹材料
2014/06/02 职场文书
科技工作者先进事迹
2014/08/16 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
李白经典诗之一:全文无一“月”字,却句句有月
2019/07/12 职场文书
解决Navicat for Mysql连接报错1251的问题(连接失败)
2021/05/27 MySQL
浅谈MySQL函数
2021/10/05 MySQL