1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
| ''' 二叉搜索树 非空左子树的值<根结点的值。 非空右子树的值>根结点的值。 左右子树都是二叉搜索树。 ''' class Node(): def __init__(self,data,left=None,right=None ): self.data = data self.left = left self.right = right
def find_(x,BinTree): if BinTree == None: return None if x > BinTree.data: return find_(x,BinTree.right) if x < BinTree.data: return find_(x,BinTree.left) elif x == BinTree.data: return BinTree
def find(x,BinTree): while BinTree: if x > BinTree.data: BinTree = BinTree.right if x < BinTree.data: BinTree = BinTree.left else: return BinTree return '没找着' '''
# 循环实现的二叉搜索树查找,效率与树的结构有关,
# 树如果都是只有左结点或者都是只有右结点,查找效率会很低。
# 因为:
# 查找次数就是树的高度,
# 如果只有左子树一边倒,就会变成一个链表,
# n个结点高度是n,查找效率不高,达不到lg(N)。
'''
def findmin(BT): if BT==None: return None if BT.left == None: return BT else: return findmin(BT.left)
def findmax(BT): if BT: while BT.right: BT = BT.right return BT
def insert(x,BT): if BT == None: BT = Node(x) BT.left = None BT.right = None else: if x < BT.data: BT.left = insert(x,BT.left) if x >= BT.data: BT.right = insert(x,BT.right) return BT
def preorder(BT,list_=[]): if BT: list_.append(BT.data) print(list_) preorder(BT.left) preorder(BT.right) return list_
''' 二叉搜索树的删除。 我们可以分三种情况: 一、删除结点为叶子结点,直接删除。 二、删除结点只有一个子结点,将父结点直接指向其子结点 (其实二情况包含了一情况)。 三、删除结点有两个子结点, (删除此结点后,要么从左边找一个最大的、要么从右边找一个最小的,补上这个结点的位置) (这样有一个好处,左最大和右最小都一定是叶子结点或者单一子结点,相当于又转为了问题一和问题二。) ''' def delete( x,BT ): if BT == None: print('未找到相应元素') elif x < BT.data: BT.left = delete(x,BT.left) elif x > BT.data: BT.right = delete(x,BT.right) elif x == BT.data: if BT.left and BT.right : temp = findmin(BT.right) BT.data = temp.data BT.right = delete(temp.data,BT.right) else: if BT.left == None: BT = BT.right elif BT.right == None: BT = BT.left return BT
if __name__ == '__main__': tree = Node(6,Node(3,Node(1),Node(4)),Node(10,None,Node(12)))
fmin = findmin(tree) fmax = findmax(tree) fx = find(10,tree) fx_ = find_(3,tree) fsert = insert(5,tree) insert_x = preorder(fsert) print(fmin.data,fmax.data,fx.data,fx_.data) print(insert_x,'\n\n') tree = Node(30,Node(15),Node(41,Node(33,None,Node(35,Node(34),None)),Node(50)))
|