【Python數據結構】——二叉查找樹(查找、構建、刪除、插入、打印)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/7/15 0:34
# @Author  : @linlianqin
# @Site    : 
# @File    : 二叉查找樹類實現(查找、創建、刪除、插入、遍歷).py
# @Software: PyCharm
# @description:class TreeNode:def __init__(self, val, left=None, right=None):self.val = valself.left = leftself.right = rightclass BST_operation:# 二叉查找數元素查找# 思路:根據二叉查找樹的左小右大的特性,當當前結點值大于target則說明值在左子樹,否則在右子樹def BST_search(self,root, target):# 當訪問到最后得到的是None,說明元素不存在查找樹上if root == None:return False# 當當前結點值等于target時查找成功if root.val == target:return True# 當結點值小于target時,說明目標有可能存在右子樹elif root.val < target:return self.BST_search(root.right, target)# 當結點值小于target時,說明目標有可能存在右子樹if root.val > target:return self.BST_search(root.left, target)# 二叉查找數元素插入# 思路:根據二叉查找樹的左小右大的特性,當當前結點值大于target則說明值插入到,否則在右子樹# 當root == None時,說明就是插入的位置def BST_insert(self,root, target):# 當值為None,創建新結點if root == None:root = TreeNode(target)# 存在時elif root.val == target:passelif root.val < target:root.right = self.BST_insert(root.right, target)elif root.val > target:root.left = self.BST_insert(root.left, target)return root# 二叉查找樹構建# 根據列表進行二叉查找數的建立# 思路:新建一個None結點作為初始頭結點,然后進行后面元素的插入def BST_create(self,li):if len(li) != 0:root = TreeNode(li[0])else:return Nonefor i in range(1, len(li)):self.BST_insert(root, li[i])return root# 二叉查找樹的刪除# 刪除根節點的處理方法,為了保證刪除根節點后依舊是一顆完整的二叉查找樹,這里可以用左子樹中的最大值和右子樹中的最小值來代替根節點,然后在子樹中刪除相應的葉節點# 1)若root值為None,說明二叉樹中不存在要刪除的值# 2)若root值剛好是target,說明已經找到了要刪除的結點,進行刪除處理操作:# a) 如果root沒有左右子樹了,直接刪除結點即可# b)如果root還有左子樹,則尋找左子樹中的最大值,用于替換root,然后在左子樹中刪除結點# c) 如果root還有右子樹,則尋找右子樹的最小樹,用于替換root,然后在右子樹中刪除結點# 3)如果root值大于target,target可能在左子樹,遞歸# 4)如果root值小于target,target可能在右子樹,遞歸## 尋找二叉查找樹以root為根節點的最小權值def BST_search_min(self,root):if root.left:return self.BST_search_min(root.left)else:return root## 尋找二叉查找樹以root為根節點的最大權值def BST_search_max(self,root):if root.right:return self.BST_search_max(root.right)else:return root## 刪除def BST_delete(self,root, target):# todo:這里可選# 1)若root值為None,說明二叉樹中不存在要刪除的值if root.val == None:return# 2)如果root值大于target,target可能在左子樹,遞歸elif root.val > target:root.left = self.BST_delete(root.left, target)# 3)如果root值小于target,target可能在右子樹,遞歸elif root.val < target:root.right = self.BST_delete(root.right, target)# 4)若root值剛好是target,說明已經找到了要刪除的結點,進行刪除處理操作:if root.val == target:# a) 如果root沒有左右子樹了,直接刪除結點即可if root.left is None and root.right is None:root = None# b)如果root還有左子樹,則尋找左子樹中的最大值,用于替換root,然后在左子樹中刪除結點elif root.left is not None:root = root.left# c) 如果root還有右子樹,則尋找右子樹的最小樹,用于替換root,然后在右子樹中刪除結點elif root.right is not None:root = root.rightreturn root# 遍歷二叉查找數,中序遍歷def BST_mid_scan(self,root):if root is None:return# 遍歷左子樹self.BST_mid_scan(root.left)# 遍歷根節點print(root.val, end=',')self.BST_mid_scan(root.right)if __name__ == '__main__':li = [5,3,7,4,2,8,6]print('li:',li)BST = BST_operation()print('構建二叉查找樹--------------------')root = BST.BST_create(li)BST.BST_mid_scan(root)# 插入print("\n插入1--------------------------")BST.BST_insert(root,1)BST.BST_mid_scan(root)# 刪除print("\n刪除6----------------------")BST.BST_delete(root,6)BST.BST_mid_scan(root)# 查找print("\n查找--------------------------------")print("在二叉樹中查找10:",BST.BST_search(root,10))print("在二叉樹中查找5:",BST.BST_search(root,5))

li: [5, 3, 7, 4, 2, 8, 6]
構建二叉查找樹--------------------
2,3,4,5,6,7,8,
插入1--------------------------
1,2,3,4,5,6,7,8,
刪除6----------------------
1,2,3,4,5,7,8,
查找--------------------------------
在二叉樹中查找10: False
在二叉樹中查找5: True

參考:

https://blog.csdn.net/ca___0/article/details/111385872

https://blog.csdn.net/u010089444/article/details/70854510

胡凡——算法筆記

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255904.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255904.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255904.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ABB RAPID SOCKET編程

相傳在2009年6月11日&#xff0c;微博的鼻祖t-w-i-t-t-e-r還沒有被封鎖的時候&#xff0c;于仁頗黎寫了了一個東西可以將staubli機器人在運行時的狀態&#xff0c;實時發送上去&#xff0c;可以被實時的查看&#xff0c;任何一個人都可以查看&#xff0c;于是就有了這個名為TWI…

Plupload文件上傳組件使用API

Plupload有以下功能和特點&#xff1a; 1、擁有多種上傳方式&#xff1a;HTML5、flash、silverlight以及傳統的<input type”file” />。Plupload會自動偵測當前的環境&#xff0c;選擇最合適的上傳方式&#xff0c;并且會優先使用HTML5的方式。所以你完全不用去操心當前…

廣告主產品推詞中的NLP

加詞&#xff0c;加產品&#xff0c;調價是廣告主的核心問題&#xff0c;為了解決廣告主加詞的問題在阿里巴巴以及速賣通的賬戶后臺提供了加詞利器——先知&#xff0c;一鍵解決廣告主煩惱&#xff0c;從此不再為加詞而憂愁。一 引言 在目前付費搜索引擎中&#xff0c;買詞和競…

Android 動態設置 layout_centerInParent

RelativeLayout.LayoutParams rp new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);rp.addRule(RelativeLayout.CENTER_IN_PARENT);記錄一下轉載于:https://www.cnblogs.com/IWings/p/6097134.html

tidevice.exceptions.MuxServiceError: Could not start service: com.apple.testmanagerd.lockdown.secure

錯誤是在進行利用pycharm IDE和airtest框架進行蘋果手機自動化測試遇到的 錯誤具體如下 [I 210715 10:32:34 _device:572] ProductVersion: 14.6 [I 210715 10:32:34 _device:551] Download https://tool.appetizer.io/iGhibli/iOS-DeviceSupport/raw/master/DeviceSupport/14…

機器人 工具坐標系的標定

概念 工具坐標系是把機器人腕部法蘭盤所握工具的有效方向定為Z軸&#xff0c;把坐標定義在工具尖端點&#xff0c;所以工具坐標的方向隨腕部的移動而發生變化。 工具坐標的移動&#xff0c;以工具的有效方向為基準&#xff0c;與機器人的位置、姿勢無關&#xff0c;所以進行相…

Linux內核分析— —計算機是如何工作的(20135213林涵錦)

實驗部分 &#xff08;以下命令為實驗樓64位Linux虛擬機環境下適用&#xff0c;32位Linux環境可能會稍有不同&#xff09; 使用 gcc –S –o main.s main.c -m32命令編譯成匯編代碼&#xff0c; int g(int x){ return x 6;} int f(int x){ return g(x);} int main(void){ r…

apache域名跳轉

①編輯虛擬主機配置文件/usr/local/apache2.4/conf/extra/httpd-vhosts.conf如下<VirtualHost *:80>DocumentRoot "/data/wwwroot/111.com"ServerName 111.comServerAlias www.example.com 2111.com.cnErrorLog "logs/111.com-error_log"CustomLog …

php 畫圖片2

<?php// 使用php操作gd庫做圖// 1. 創建一個畫布資源$im imagecreatetruecolor(200, 50);// 2. 創建背景色// 2.1 得到背景顏色$bg_color imagecolorallocate($im, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));// 2.2 填充畫布imagefill($im, 0, 0, $bg_c…

ABB機器人ROBOTSTUDIO中軌跡與二次開發的問答

問&#xff1a; 在視頻學習里&#xff0c;robotstudio可以提取物體的某條輪廓來直接生成路徑。請問&#xff0c;1.如果要提取的是模型兩邊的中心線&#xff0c;也能直接生成路徑嗎&#xff1f;2.robotstudio有二次開發的功能嗎&#xff0c;比如對數據進行運算。我也不知道我說的…

【Python數據結構】——二叉平衡樹AVL(查找、構建、刪除、插入、打印、遍歷)

#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/7/28 20:57 # Author : linlianqin # Site : # File : 二叉平衡樹專題&#xff08;創建、插入、查找&#xff09;.py # Software: PyCharm # description:二叉平衡樹的特點&#xff1a;在二叉查找樹的…

隨筆速記

LVM增加與縮小Swap分區操作 http://blog.sina.com.cn/s/blog_5f2ca1ed0101ebw8.html Ubuntu刪除多余內核 # dpkg --get-selections | grep linux # apt-get purge linux-headers-3.0.0-12 linux-image-3.0.0-12-generic # update-grub Ubuntu清理安裝包、已卸載軟件、已卸載軟件…

【測試開發】測試用例講解

文章目錄 目錄 文章目錄 前言 一、測試用例的基本要素 二、測試用例的設計方法 1.基于需求的設計方法 對日歷根據web界面的功能布局分析出的功能框圖如下&#xff1a; 繼續舉一個例子百度云盤非功能測試的案例&#xff1a; 2.等價類 3.邊界值 5.正交表 6.場景設計法 7…

Linux下進行Web服務器壓力(并發)測試工具http_load、webbench、ab、Siege、autobench簡單使用教程(轉)...

一、http_load 程序非常小&#xff0c;解壓后也不到100K http_load以并行復用的方式運行&#xff0c;用以測試web服務器的吞吐量與負載。但是它不同于大多數壓力測試工 具&#xff0c;它可以以一個單一的進程運行&#xff0c;一般不會把客戶機搞死。還可以測試HTTPS類的網站請求…

【Python數據結構】——并查集的實現(查找、合并、集合、實例)

#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/7/30 23:12 # Author : linlianqin # Site : # File : 并查集專題&#xff08;合并、查找、集合&#xff09;.py # Software: PyCharm # description: 并查集其實就是多個數組&#xff0c;每一個數組都…

如何實現ABB機器人與老式焊機的連接控制

問題&#xff1a; 請教一個機器人與老式焊機如何連接&#xff0c;如何設置。 我現在是用SET指令設DO為1再外接繼電器來控制焊機工作的&#xff0c;用RESET指令來使焊機停止工作的。現在可 以焊接&#xff0c;但是如果中間停止或機器人報錯停止不動&#xff0c;焊機始終處于工作…

gitlab 雜記

GitLab 編譯部署 1&#xff0c;請盡量不要在國內主機上部署&#xff0c;中途天朝很有可能導致gem執行出現問題&#xff0c;以下在AWS上部署&#xff1b; 2&#xff0c;系統中必須要有swap分區&#xff0c;不然會出現500錯誤&#xff1b; 系統版本&#xff1a;CentOS 6.x x86_6…

Hadoop分布式系統的安裝部署

1、關于虛擬機的復制 新建一臺虛擬機&#xff0c;系統為CentOS7&#xff0c;再克隆兩臺&#xff0c;組成一個三臺機器的小集群。正常情況下一般需要五臺機器&#xff08;一個Name節點&#xff0c;一個SecondName節點&#xff0c;三個Data節點。&#xff09; 此外&#xff0c;為…

Windows線程調度學習(一)

前言 Windows 線程調度器的實現分散在內核各處&#xff0c;并且與許多組件都有關聯&#xff0c;很難進行系統地學習&#xff0c;所以我打算寫幾篇文章來記錄下自己學習過程中的思考和分析&#xff0c;同時也方便日后查閱&#xff0c;此文可以看作是《Windows內核原理與實現》中…

機器人的有效負荷

問題&#xff1a; 假如我想在程序里做多幾個有效載荷,但在手動操縱畫面上只能加一個,其它要怎樣用?給個實際例子給我啊. 回答&#xff1a; 在搬運中&#xff0c;確實是有載荷發生變化的情況&#xff0c;如兩抓(A B)的夾具&#xff0c;有三種載荷情況&#xff0c;1、A抓有載荷…