Skip to content

Commit 7e89e4f

Browse files
committed
二叉搜索树
1 parent 7f17756 commit 7e89e4f

3 files changed

Lines changed: 79 additions & 1 deletion

File tree

ch01_basic/at014_rightshift.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
# at014_rightshift: 数组循环右移
4+
"""
5+
Topic: sample
6+
Desc : 数组循环右移
7+
"""
8+
__author__ = 'Xiong Neng'
9+
10+
11+
def rightShift(seq, k):
12+
n = len(seq)
13+
k %= n
14+
seq[0:n - k] = seq[n - k - 1::-1]
15+
seq[n - k: n] = seq[:n - k - 1:-1]
16+
seq[:] = seq[::-1]
17+
18+
19+
if __name__ == '__main__':
20+
s = list('abcd1234')
21+
rightShift(s, 4)
22+
print(s)

ch03_datastruct/at301_bisearchtree.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ def __init__(self, root):
1616

1717
class Node():
1818
"""节点元素定义"""
19+
1920
def __init__(self, key, p=None, left=None, right=None):
2021
self.key = key
2122
self.p = p
@@ -101,10 +102,50 @@ def treeInsert(tree, node):
101102
else:
102103
root = root.right
103104
node.p = y
104-
if not y: # empty tree
105+
if y is None: # empty tree
105106
tree.root = node
106107
elif node.key < y.key:
107108
y.left = node
108109
else:
109110
y.right = node
110111

112+
113+
def treeDelete(T, z):
114+
"""
115+
二叉搜索树的删除算法
116+
算法思想:
117+
1,如果z没有孩子节点,简单简单的将其删除,并修改它的父节点,用None作为孩子来替换
118+
2,如果z只有一个孩子,那么将这个孩子提升到树中z的位置,并修改z的父节点,用z的孩子替换z
119+
3,如果z有两个孩子,那么寻找z的后继节点y(一定在z的右子树中),找到后:
120+
i:如果y是z的右孩子,那么用y替换z,并仅留下y的右孩子。(y肯定没有左孩子)
121+
ii:否则,先用y的右孩子替换,然后再用y替换z
122+
"""
123+
if z.left is None:
124+
transplant(T, z, z.right)
125+
elif z.right is None:
126+
transplant(T, z, z.left)
127+
else:
128+
y = treeMinimum(z.right)
129+
if y.p != z:
130+
transplant(T, y, y.right)
131+
y.right = z.right
132+
y.right.p = y
133+
transplant(T, z, y)
134+
y.left = z.left
135+
y.left.p = y
136+
137+
138+
def transplant(T, u, v):
139+
"""子树替换:在树T中用根节点节点为v的子树替换根节点为u的子树"""
140+
if u.p is None:
141+
T.root = v
142+
elif u == u.p.left:
143+
u.p.left = v
144+
else:
145+
u.p.right = v
146+
if not v:
147+
v.p = u.p
148+
149+
150+
151+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
# at302_redblacktree: 红黑树
4+
"""
5+
Topic: sample
6+
Desc : 红黑树
7+
红黑树是满足下面红黑性质的二叉搜索树:
8+
1,每个结点或者是红色的,或者是黑色的
9+
2,根结点黑色
10+
3,每个叶子结点(None)是黑色的
11+
4,如果一个结点是红色的,则它的两个子结点都是黑色的
12+
5,对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点。
13+
一个有n个内部结点的红黑树的高度最多为2lg(n+1)
14+
"""
15+
__author__ = 'Xiong Neng'

0 commit comments

Comments
 (0)