前言
- 有Python基础
- 知道二叉树的概念,可以参考 https://blog.csdn.net/sf9898/article/details/105007041
原理
- 上面的定义来自于百度百科。上面有一点,没有键值相等的结点。但是有的地方又说可以相等,无论怎么样,这一点在代码上的差距无非是if语句里面多写与少写几行罢了。
- 根据排序二叉树的定义,它和普通二叉树的区别主要是在插入部分还要做判断,小盆友往左边走,大盆友走右边(比当前值大的往右边,比当前值小的往左边),因此可以继承一下二叉树的方法,之后重新写下添加的方法。
实现
class Node(object):
def __init__(self, item):
self.item = item
self.left = None
self.right = None
class SortedTree(object):
def __init__(self):
self.root = None
def travel(self):
if self.root is None:
return
q = [self.root]
while q:
nd = q.pop(0)
print(nd.item, end=' ')
if nd.left:
q.append(nd.left)
if nd.right:
q.append(nd.right)
print('')
def forward(self, root):
if root is None:
return
print(root.item, end=' ')
self.forward(root.left)
self.forward(root.right)
def middle(self, root):
if root is None:
return
self.middle(root.left)
print(root.item, end=' ')
self.middle(root.right)
def back(self, root):
if root is None:
return
self.back(root.left)
self.back(root.right)
print(root.item, end=' ')
def add(self, item):
node = Node(item)
if self.root is None:
# 如果当前根节点是空的,那么直接当根节点
self.root = node
return
cur = self.root
while cur:
if item > cur.item:
# 输入的这个数比当前的node的item还大,那说明应该排在当前结点的右边
if cur.right:
cur = cur.right
else:
# 这个位置是空的额,那么直接挂在这就行了
cur.right = node
break
else:
# 小于或等于就挂左边了
if cur.left:
cur = cur.left
else:
# 左边没东西就直接挂上
cur.left = node
break
st = SortedTree()
st.add(10)
st.add(20)
st.add(3)
st.add(4)
st.add(1100)
st.add(1)
- 对其进行各种遍历,结果如下
层次遍历:10 3 20 1 4 1100
前序遍历:10 3 1 4 20 1100
中序遍历:1 3 4 10 20 1100
后序遍历:1 4 3 1100 20 10
- 验证一下,完整代码
class Node(object):
def __init__(self, item):
self.item = item
self.left = None
self.right = None
class SortedTree(object):
def __init__(self):
self.root = None
def travel(self):
if self.root is None:
return
q = [self.root]
while q:
nd = q.pop(0)
print(nd.item, end=' ')
if nd.left:
q.append(nd.left)
if nd.right:
q.append(nd.right)
print('')
def forward(self, root):
if root is None:
return
print(root.item, end=' ')
self.forward(root.left)
self.forward(root.right)
def middle(self, root):
if root is None:
return
self.middle(root.left)
print(root.item, end=' ')
self.middle(root.right)
def back(self, root):
if root is None:
return
self.back(root.left)
self.back(root.right)
print(root.item, end=' ')
def add(self, item):
node = Node(item)
if self.root is None:
# 如果当前根节点是空的,那么直接当根节点
self.root = node
return
cur = self.root
while cur:
if item > cur.item:
# 输入的这个数比当前的node的item还大,那说明应该排在当前结点的右边
if cur.right:
cur = cur.right
else:
# 这个位置是空的额,那么直接挂在这就行了
cur.right = node
break
else:
# 小于或等于就挂左边了
if cur.left:
cur = cur.left
else:
# 左边没东西就直接挂上
cur.left = node
break
st = SortedTree()
st.add(10)
st.add(20)
st.add(3)
st.add(4)
st.add(1100)
st.add(1)
st.travel()
st.forward(st.root)
print('')
st.middle(st.root)
print('')
st.back(st.root)