二叉搜索树介绍
二叉搜索树的python建立
建立空的二叉搜索树,只存在空根节点
代码如下:
class Node:
def __init__(self,val):
self.val=val
self.parent=None
self.lchild=None
self.rchild=None
class Tree:
def __init__(self):
self.root=None
root=Node(5)
tree=Tree()
tree.root=root //建立只有根节点的搜索树
二叉搜索树的插入数据操作
在空树类内部创建一个insert函数,每插入一个数据,则创建一个根节点,并根据二叉搜索树的特性插入到书上。
代码如下:
class Node:
def __init__(self,val):
self.val=val
self.parent=None
self.lchild=None
self.rchild=None
class Tree:
def __init__(self):
self.root=None
def insert(self,val):
p=self.root
if not p:
self.root=Node(val)
return
while True:
if val>p.val:
if p.rchild:
p=p.rchild
else:
p.rchild=Node(val)
p.rchild.parent=p
return
elif val<p.val:
if p.lchild:
p=p.lchild
else:
p.lchild=Node(val)
p.lchild.parent=p
return
tree=Tree()
tree.insert(5)
tree.insert(10)
tree.insert(3)
print(tree.root.val)
print(tree.root.lchild.val)
print(tree.root.rchild.val)
输出结果为:5,3,10
二叉搜索树的遍历操作
前部遍历
class Node:
def __init__(self,val):
self.val=val
self.parent=None
self.lchild=None
self.rchild=None
class Tree:
def __init__(self):
self.root=None
def insert(self,val):
p=self.root
if not p:
self.root=Node(val)
return
while True:
if val>p.val:
if p.rchild:
p=p.rchild
else:
p.rchild=Node(val)
p.rchild.parent=p
return
elif val<p.val:
if p.lchild:
p=p.lchild
else:
p.lchild=Node(val)
p.lchild.parent=p
return
def pre_order(self,root):
if root:
print(root.val,end=',')
self.pre_order(root.lchild)
self.pre_order(root.rchild)
tree=Tree()
tree.insert(5)
tree.insert(10)
tree.insert(3)
tree.pre_order(tree.root)
输出结果为:5,3,10
中部遍历(数据排序)
class Node:
def __init__(self,val):
self.val=val
self.parent=None
self.lchild=None
self.rchild=None
class Tree:
def __init__(self):
self.root=None
def insert(self,val):
p=self.root
if not p:
self.root=Node(val)
return
while True:
if val>p.val:
if p.rchild:
p=p.rchild
else:
p.rchild=Node(val)
p.rchild.parent=p
return
elif val<p.val:
if p.lchild:
p=p.lchild
else:
p.lchild=Node(val)
p.lchild.parent=p
return
def pre_order(self,root):
if root:
self.pre_order(root.lchild)
print(root.val,end=',')
self.pre_order(root.rchild)
tree=Tree()
tree.insert(5)
tree.insert(10)
tree.insert(3)
tree.pre_order(tree.root)
输出结果为:3,5,10 可以利用此方法进行排序
尾部排序
class Node:
def __init__(self,val):
self.val=val
self.parent=None
self.lchild=None
self.rchild=None
class Tree:
def __init__(self):
self.root=None
def insert(self,val):
p=self.root
if not p:
self.root=Node(val)
return
while True:
if val>p.val:
if p.rchild:
p=p.rchild
else:
p.rchild=Node(val)
p.rchild.parent=p
return
elif val<p.val:
if p.lchild:
p=p.lchild
else:
p.lchild=Node(val)
p.lchild.parent=p
return
def pre_order(self,root):
if root:
self.pre_order(root.lchild)
self.pre_order(root.rchild)
print(root.val,end=',')
tree=Tree()
tree.insert(5)
tree.insert(10)
tree.insert(3)
tree.pre_order(tree.root)
输出结果为 3,10,5
逐层遍历
运用队列的特性,逐层输出
from collections import deque
class Node:
def __init__(self,val):
self.val=val
self.parent=None
self.lchild=None
self.rchild=None
class Tree:
def __init__(self):
self.root=None
def insert(self,val):
p=self.root
if not p:
self.root=Node(val)
return
while True:
if val>p.val:
if p.rchild:
p=p.rchild
else:
p.rchild=Node(val)
p.rchild.parent=p
return
elif val<p.val:
if p.lchild:
p=p.lchild
else:
p.lchild=Node(val)
p.lchild.parent=p
return
def level_order(self,root):
queue=deque()
queue.append(root)
while len(queue)>0:
node=queue.popleft()
print(node.val,end=',')
if node.lchild:
queue.append(node.lchild)
if node.rchild:
queue.append(node.rchild)
tree=Tree()
tree.insert(5)
tree.insert(10)
tree.insert(3)
tree.pre_order(tree.root)
输出结果为:5,3,10 (3和10在同一层)