数据结构之二叉树:二叉查找树基本功能,Python代码实现——10

数据结构之二叉查找树的代码实现

定义

  • 二叉查找树(Binary Search Tree,BST),是一种内存中特殊的树类型的存储结构,它允许对存储在其结点的数据进行增删改查,或者用作动态的数据集合,或是通过key查找对应value的查找表;

创建结点

  • 设计:可以使用顺序表或链表实现二叉树,这里使用链表实现,在学习堆时再使用顺序表实现

使用链表结点设计:

class Node:def __init__(self, key=None, value=None):self.key = keyself.value = valueself.left = Noneself.right = None

left和right分别代表左右子结点,key是可比较的,用于进行顺序匹配;value储存值

实现的功能

  • 构造方法__init__(),root为根结点,默认为None,len为树的大小
  1. size()获取BST中元素个数
  2. put(_key, _value)向树中添加键值对元素,元素按key排序,返回添加元素后的新树
  3. get(_key)通过键获取树中对应元素的值
  4. delete(_key)通过键删除树中对应的元素
  5. min_key()获取最小的key
  6. max_key()获取最大的key

Python代码实现

import operatorclass Node:def __init__(self, key=None, value=None):self.key = keyself.value = valueself.left = Noneself.right = Noneclass BinarySearchTree:def __init__(self):self.root = Noneself.len = 0def size(self):return self.lendef put(self, _key, _value):"""Put an element into this tree and generate a new BST"""def put_into(node, _key, _value):"""Adjust position of new inserted nodeby BST character:left > root > right"""if not node:self.len += 1return Node(_key, _value)if operator.lt(_key, node.key):node.left = put_into(node.left, _key, _value)elif operator.gt(_key, node.key):node.right = put_into(node.right, _key, _value)elif operator.eq(_key, node.key):node.value = _valuereturn nodeself.root = put_into(self.root, _key, _value)return self.rootdef get(self, _key):"""Get a value responding to the given _key from this tree"""def get_value_by_key(node, _key):if not node:returnif operator.lt(_key, node.key):return get_value_by_key(node.left, _key)elif operator.gt(_key, node.key):return get_value_by_key(node.right, _key)else:return node.valuereturn get_value_by_key(self.root, _key)def delete(self, _key):"""Delete a node responding to the giving key(_key)"""def delete_value_by_key(node, _key):if not node:returnif operator.lt(_key, node.key):node.left = delete_value_by_key(node.left, _key)elif operator.gt(_key, node.key):node.right = delete_value_by_key(node.right, _key)else:self.len -= 1to_delete_node = nodeif node == self.root:self.root = Nonereturn# node = Noneif not to_delete_node.left:return to_delete_node.rightelif not to_delete_node.right:return to_delete_node.leftelse:min_right_tree = to_delete_node.rightpre = min_right_treewhile min_right_tree.left:pre = min_right_treemin_right_tree = min_right_tree.leftpre.left = Nonemin_right_tree.left = to_delete_node.leftmin_right_tree.right = to_delete_node.rightreturn min_right_treereturn delete_value_by_key(self.root, _key)def min_key(self):"""Find the minimum key"""def min_node(node):while node.left:node = node.leftreturn nodereturn min_node(self.root).keydef max_key(self):"""Find the maximum key"""def max_node(node):while node.right:node = node.rightreturn nodereturn max_node(self.root).keydef max_depth(self):"""Calculate the max depth of this tree"""def max_depth(node):max_left, max_right = 0, 0if not node:return 0if node.left:max_left = max_depth(node.left)if node.right:max_right = max_depth(node.right)return max(max_left, max_right) + 1return max_depth(self.root)

主要代码解释:

put()插入元素:使用递归,按照从上到下从左到右的顺序,依次和插入的元素比较

  • 1.如果当前树中没有任何一个结点,则直接把新结点当做根结点使用并返回
  • 2.如果当前树不为空, 则从根结点开始与传入的元素的key进行比较:
    2.1如果新结点的key小于当前结点的key ,则继续找当前结点的左子结点;
    2.2如果新结点的key大于当前结点的key ,则继续找当前结点的右子结点;
    2.3如果新结点的key等于当前结点的key ,则树中已经存在这样的结点,替换该结点的value值即可。

delete()删除元素:跟插入元素类似,也是使用递归,寻找的顺序按照从上到下从左到右的顺序,依次和插入的元素比较,如果找到key相等的元素则做删除动作

  • 如果找到key相等的元素,则只需要往这个结点的右子树的左边最深处寻找,根据排序的规律,找到的元素与key相等的元素交换位置即可

代码测试

if __name__ == '__main__':BST = BinarySearchTree()BST.put('e', '5')BST.put('b', '2')BST.put('g', '7')BST.put('a', '1')BST.put('d', '4')BST.put('f', '6')BST.put('h', '8')BST.put('c', '3')print(f"The size of this binary tree now is {BST.size()}\n")key = 'a'print(f"\nGet element by key[{key}]: {BST.get(key)}")key = 'b'BST.delete(key)print(f"After deleting an node ({key}), the size of this tree: {BST.size()}")print(f"Get the deleted value (key[{key}]), it should be none: {BST.get(key)}")print(f"Get the value (key[{'a'}]), it should be {1}: {BST.get('a')}")

测试结果

The size of this binary tree now is 8Get element by key[a]: 1
After deleting an node (b), the size of this tree: 7
Get the deleted value (key[b]), it should be none: None
Get the value (key[a]), it should be 1: 1Process finished with exit code 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV_03 图像的算数操作:图像的加法+图像的混合

1.图像的加法 你可以使用OpenCV的cv.add()函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像,如res img1 img2。两个图像应该具有相同的大小和类型,或者第二个图像可以是标量值。 注意:OpenCV加法和Numpy加法之间存…

【bzoj2806】 Ctsc2012—Cheat

http://www.lydsy.com/JudgeOnline/problem.php?id2806 (题目链接) 题意 给出M个字符串组成“标准库”。定义L表示将一个字符串分成若干段,每一段的长度不小于L,其中是在标准库中任一字符串的子串的字符“段”的长度之和不小于原字符串长度之和的90%。N…

怎样在Linux驱动中创建proc节点(示例)

一、定义proc节点的读、写函数 static int tp_switch_writeproc(struct file *file,const char *buffer, unsigned long count,void *data) { sscanf(buffer,"%d", &tp_dbg); printk("tpd: proc-->tp_dbg %d\n", tp_dbg); return count; } static …

数据结构之二叉树:二叉查找树的先序、中序、后序、层序遍历,Python代码实现——10(续)

数据结构之二叉查找树的代码实现 本节继续对上一节BST的功能实现 在实现之前,先对要实现的功能进行一下简单的介绍 BST的几种常见遍历方式 以一个简化的树为例,一棵树包含根(父)结点和其左子树及右子树: 遍历顺序的先后是指根(父)结点被遍…

OpenCV_04 几何变换:图像缩放+图像平移+图像旋转+仿射变换+透射变换+图像金字塔

1 图像缩放 缩放是对图像的大小进行调整,即使图像放大或缩小。 API cv2.resize(src,dsize,fx0,fy0,interpolationcv2.INTER_LINEAR)参数: src : 输入图像 dsize: 绝对尺寸,直接指定调整后图像的大小 fx,fy: 相对尺寸,将dsize设…

Direct2D教程(九)渲染位图

概述 这篇的标题更确切的说应该叫位图画刷,这样才好和前几篇对应起来。在Direct2D中,位图的渲染也是通过画刷来实现的。 Direct2D中并没有直接操作位图的接口,而是借助WIC(Windows Image Component)来完成的。今天我们…

OpenCV_05 形态学操作:连通性+腐蚀和膨胀+开闭运算+礼帽和黑帽

1 连通性 在图像中,最小的单位是像素,每个像素周围有8个邻接像素,常见的邻接关系有3种:4邻接、8邻接和D邻接。分别如下图所示: 4邻接:像素p(x,y)的4邻域是:(x1,y);(x-1,y)&#xff…

数据结构之二叉树:折纸问题——11

数据结构之二叉树:Python代码解决折纸问题 折纸问题 要求:请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时折痕是凹下去的,即折痕突起的方向指向纸条的背面。如果从纸条的下边向上方…

OpenCV_06 图像平滑:图像噪声+图像平滑+滤波

1 图像噪声 由于图像采集、处理、传输等过程不可避免的会受到噪声的污染,妨碍人们对图像理解及分析处理。常见的图像噪声有高斯噪声、椒盐噪声等。 1.1 椒盐噪声 椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白…

Android kernel Crash后,定位出错点的方法

1. 将/prebuild/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-gdb 拷贝到/usr/local/bin下 2. 进入out/target/product/工程名xxx/obj/KERNEL_OBJ 目录,找到文件vmlinux

Vuejs 写法实例

原文地址&#xff1a;http://www.jianshu.com/p/293387d240b2 Hello World <div id"app">{{ message }}<button v-on:click"clickMe()">点击</button> <button v-on:click"clickMe">无参数的简写</button> </d…

数据结构之堆:堆的介绍与python实现——12

堆的简单实现与代码实现 堆的定义 在定义堆&#xff08;heap&#xff09;之前&#xff0c;先回顾一下完全二叉树的定义&#xff1a; 完全二叉树&#xff1a;除了最后一层的结点有可能没有达到最大值外&#xff0c;其它层的结点值都达到最大值&#xff0c;此外最后一层的叶子…

OpenCV_07 直方图:灰度直方图+直方图均衡化

1 灰度直方图 1.1 原理 直方图是对数据进行统计的一种方法&#xff0c;并且将统计值组织到一系列实现定义好的 bin 当中。其中&#xff0c; bin 为直方图中经常用到的一个概念&#xff0c;可以译为 “直条” 或 “组距”&#xff0c;其数值是从数据中计算出的特征统计量&…

OpenCV_08 边缘检测:Sobel检测算子+Laplacian算子+Canny边缘检测

1 原理 边缘检测是图像处理和计算机视觉中的基本问题&#xff0c;边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。边缘的表现形式如下图所示&#xff1a; 图像边缘检测大幅度地减少了数据量&#xff0c;并且剔除了可以…

linux module_init

就像你写C程序需要包含C库的头文件那样&#xff0c;Linux内核编程也需要包含Kernel头文件&#xff0c;大多的Linux驱动程序需要包含下面三个头文件&#xff1a; #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> 其中&#xff…

数据结构之堆:堆的排序,Python代码实现——13

堆的排序&#xff0c;使用Python代码实现 上一节对堆进行了简单的实现&#xff0c;但是实现的堆只是部分有序&#xff08;父结点大于子结点&#xff0c;子结点之间无序&#xff09; 接下来我们实现对堆的所有元素进行升序排序 排序过程 实现步骤: 构造堆;得到堆顶元素,这个…

Anaconda 镜像源操作(查看配置删除)

一、Anaconda查看镜像配置 conda config --show channelschannels: https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/defaults二、添加清华大学镜像 conda config --add channels https://mirrors.tuna.t…

multi-line comment In file

写注释引起的编译问题&#xff1a; //s3c_gpio_cfgpin(pin, GTP_INT_CFG); \//s3c_gpio_cfgpin(pin, GTP_INT_CFG); \ 如果向上面那样写注释的话&#xff0c;就会引起问题&#xff0c;GCC&#xff0c;警告&#xff0c;有可能编译不通过&#xff0c;我遇到的问题就是编译不通过…

资治通鉴

本书于2017年1月15日开始看并于2017年1月17日看完&#xff0c;基本上只是culver看了一遍&#xff0c;只了解了故事而并没有分析&#xff0c;故事中每个人的思想和可能的想法&#xff0c;而且司马光对于宋朝以前的历史是截取了很多的片段记载的&#xff0c;并不能完整的了解历史…

【完美解决方案】module ‘cv2.cv2‘ has no attribute ‘xfeatures2d‘

一、问题描述 在学习openCV的过程中使用了SIFT的时候&#xff0c;发现书上的代码用不了&#xff0c;报错&#xff1a; module cv2.cv2 has no attribute xfeatures2d 二、问题原因 算法被申请了专利&#xff0c;将opencv版本退到3.4.2即可解决&#xff0c;必须小于等于Python…