標籤:article 最小 區分 query 情況 code content 尋找和刪除 size
1. 二叉尋找樹的定義:
左子樹不為空白的時候。左子樹的結點值小於根節點,右子樹不為空白時,右子樹的結點值大於根節點。左右子樹分別為二叉尋找樹
2. 二叉尋找樹的最左邊的結點即為最小值,要尋找最小值。僅僅需遍曆左子樹的結點直到為空白為止。同理,最右邊的結點結尾最大值。要尋找最大值,僅僅需遍曆右子樹的結點直到為空白為止。二叉尋找樹的插入尋找和刪除都是通過遞迴的方式來實現的,刪除一個結點的時候,先找到這個結點S,假設這個結點左右孩子都不為空白,這時並非真正的刪除這個結點S,而是在其右子樹找到後繼結點,將後繼結點的值付給S,然後刪除這個後繼結點就可以。
假設結點S的左孩子或者右孩子為空白,能夠直接刪除這個結點S。
3. 二叉尋找樹的python實現:
class TreeNode:def __init__(self,val):self.val=val;self.left=None;self.right=None;def insert(root,val):if root is None:root=TreeNode(val);else:if val<root.val:root.left=insert(root.left,val); #遞迴地插入元素elif val>root.val:root.right=insert(root.right,val); return root;def query(root,val):if root is None:return ;if root.val is val:return 1;if root.val <val:return query(root.right,val); #遞迴地查詢else: return query(root.left,val);def findmin(root):if root.left:return findmin(root.left);else:return root;def delnum(root,val):if root is None:return ;if val<root.val:return delnum(root.left,val);elif val>root.val:return delnum(root.right,val);else: # 刪除要區分左右孩子是否為空白的情況if(root.left and root.right):tmp=finmin(root.right); #找到後繼結點root.val=tmp.val;root.right=delnum(root.right,val); #實際刪除的是這個後繼結點else:if root.left is None:root=root.right;elif root.right is None:root=root.left;return root;#測試代碼root=TreeNode(3);root=insert(root,2);root=insert(root,1);root=insert(root,4);#print query(root,3);print query(root,1);root=delnum(root,1);print query(root,1);
二叉尋找樹python實現