二叉樹的插入和搜尋–python實現
本文首先介紹了二分查詢法,採用“迴圈”和“遞迴”2種方法實現。採用遞迴演算法實現了二叉樹的插入和搜尋演算法。
一、二分查詢法
查詢演算法的計算複雜度為O(n)、O(logN)、O(1)。
- 無序列表,順序查詢法時間複雜度為O(n)。
- 排好序的結構,O(logN)
- hash表,O(1)
二、二分查詢法程式碼
迴圈方式
a = [x for x in range(100)]
target = 51
l=0
r=100
while(l<=r):
mid = (l+r)//2
if(a[mid]>target):
// 下一次迴圈[l,mid)
r=mid
elif(a[mid]<target):
// [mid,r)
l=mid+1
//此時命中
else:
print("target position:%d" % mid)
break
遞迴實現
def binarySearch(l,r,target):
mid = (l+r)//2
if(a[mid]>target):
r=mid
return binarySearch(l,r,target)
elif(a[mid]<target):
l = mid+1
return binarySearch(l,r,target)
else:
return mid
postion2 = binarySearch(0,100,50)
print(postion2) //50
postion3 = binarySearch(0,100,51)
print(postion3) //51
三、二叉樹的搜尋演算法
在二分查詢基於陣列,在插入刪除時需要移動較多節點,採用二叉樹的資料結構,更好的實現插入、刪除操作。
class BinarySearchTree2:
#在此處定義的靜態變數
def __init__(self):
self.count=0
self.root = None
def count():
return self.count
def insert(self,key,value):
if(self.count == 0):
self.root = Node(key,value)
self.count = self.count+1
return
else:
node = self.root
while True:
if(node.key>key):
if(node.lnode == None):
node.lnode = Node(key,value)
return
else:
node = node.lnode
elif(node.key<key):
if(node.rnode == None):
node.rnode = Node(key,value)
return
else:
node = node.rnode
def contains(self,key):
return self._contain(self.root,key)
def _contain(self,node,key):
if(node == None):
return False
if(node.key > key):
return self._contain(node.lnode,key)
elif(node.key < key):
return self._contain(node.rnode,key)
else:
return True
四、總結
查詢演算法是計算機中的基本問題,無論面試還是在日常工作中,都會經常遇到查詢問題。本文,根據二分搜尋演算法用Python實現二叉樹。
相關文章
- 二叉搜尋樹的python實現Python
- Java實現二叉搜尋樹的插入、刪除Java
- javascript實現二叉搜尋樹JavaScript
- 701. 二叉搜尋樹中的插入操作
- js實現完全排序二叉樹、二叉搜尋樹JS排序二叉樹
- JavaScript 二叉搜尋樹以及實現翻轉二叉樹JavaScript二叉樹
- python 二叉樹深度優先搜尋和廣度優先搜尋Python二叉樹
- 實現二叉搜尋樹的新增,查詢和刪除(JAVA)Java
- 資料結構-二叉搜尋樹的實現資料結構
- 二叉搜尋樹和二叉樹的最近公共祖先二叉樹
- 如何在 Java 中實現二叉搜尋樹Java
- 二叉搜尋樹(Binary Search Tree)(Java實現)Java
- [Python手撕]不同的二叉搜尋樹Python
- 有序表和搜尋二叉樹二叉樹
- 二叉搜尋樹
- [Python手撕]判斷二叉搜尋樹Python
- 資料結構和演算法-Go實現二叉搜尋樹資料結構演算法Go
- 938-二叉搜尋樹的範圍和
- 二分搜尋樹元素的插入
- 資料結構之二叉搜尋樹—Java實現資料結構Java
- 二叉搜尋樹的操作集
- 二叉搜尋樹的結構
- Day20 | 654.最大二叉樹 、 617.合併二叉樹 、 700.二叉搜尋樹中的搜尋 98.驗證二叉搜尋樹二叉樹
- 程式碼隨想錄演算法訓練營第22天 |二叉樹part07:235. 二叉搜尋樹的最近公共祖先、701.二叉搜尋樹中的插入操作、450.刪除二叉搜尋樹中的節點演算法二叉樹
- Java實現 LeetCode 35 搜尋插入位置JavaLeetCode
- 如何在Java中實現二叉搜尋樹( binary search tree)?Java
- 資料結構高階--二叉搜尋樹(原理+實現)資料結構
- 從二分搜尋到二叉搜尋樹
- Leetcode 700. 二叉搜尋樹中的搜尋(DAY 2)LeetCode
- 96. 不同的二叉搜尋樹
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 程式碼隨想錄演算法訓練營day22 | leetcode 235. 二叉搜尋樹的最近公共祖先、701. 二叉搜尋樹中的插入操作、450. 刪除二叉搜尋樹中的節點演算法LeetCode
- 程式碼隨想錄演算法訓練營day19| 235. 二叉搜尋樹的最近公共祖先 701.二叉搜尋樹中的插入操作 450.刪除二叉搜尋樹中的節點演算法
- 程式碼隨想錄演算法訓練營第19天|235. 二叉搜尋樹的最近公共祖先 ,701.二叉搜尋樹中的插入操作,450.刪除二叉搜尋樹中的節點演算法
- 滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹(二叉查詢樹)和最優二叉樹二叉樹
- leetcode 700. 二叉搜尋樹中的搜尋 思考分析LeetCode
- 程式碼隨想錄day18 || 530 二叉搜尋樹最小差,501 二叉搜尋樹眾數,236 二叉搜尋樹最近公共祖先
- 圖的廣度優先搜尋和深度優先搜尋Python實現Python