- 二叉树
- 完全二叉树
除d层外,其他层达到最大值,且d层所有节点从左到右连续紧密排序
满二叉树:d层也达到最大值的完全二叉树 - 平衡二叉树
当且仅当任何节点的两棵子树的高度差不大于1的二叉树
作用:防止树退化成链表 - 排序二叉树
1.若左子树不为空,则左子树上所有节点的值均小于它的根节点的值
2.若右字数不为空,则右子树上所有节点的值均小于他的根节点的值
3.左、右子树也分别为二叉排序树(二叉排序树包含孔数)
遍历:
- 深度优先:
深度优先往往可以很快找到搜索路径
分类:
1.先序:根左右
2.中序:左根右
3.后序:左右根 - 广度优先:(广度优先可以找到最短路径)
一层一层遍历
- 代码实现:
class Node(object):
def __init__(self, item):
self.item = item
self.lchild = None
self.rchild = None
class BinaryTree(object):
def __init__(self, node=None):
self.root = node
def add(self, item):
if self.root == None:
self.root = Node(item)
return
queue = []
queue.append(self.root)
while True:
node = queue.pop(0)
if node.lchild == None:
node.lchild = Node(item)
# print(item)
return
else:
queue.append(node.lchild)
if node.rchild == None:
node.rchild = Node(item)
# print(item)
return
else:
queue.append(node.rchild)
def dm_travel(self):
if self.root == None:
return
queue = []
queue.append(self.root)
while len(queue)>0:
node = queue.pop(0)
print(node.item, end='')
if node.lchild is not None:
queue.append(node.lchild)
if node.rchild is not None:
queue.append(node.rchild)
def xian_sort(self,root):
"""先序遍历"""
if root is not None:
print(root.item,end=',')
self.xian_sort(root.lchild)
self.xian_sort(root.rchild)
def zhong_sort(self,root):
"""中序"""
if root is not None:
self.xian_sort(root.lchild)
print(root.item,end=',')
self.xian_sort(root.rchild)
def hou_sort(self,root):
"""后序遍历"""
if root is not None:
self.xian_sort(root.lchild)
self.xian_sort(root.rchild)
print(root.item, end=',')
def dm_插入节点():
mytree = BinaryTree()
mytree.add('A')
mytree.add('B')
mytree.add('C')
mytree.add('D')
mytree.add('E')
mytree.add('F')
mytree.add('G')
mytree.add('H')
mytree.dm_travel()
print()
mytree.xian_sort(mytree.root)
print()
mytree.zhong_sort(mytree.root)
print()
mytree.hou_sort(mytree.root)
if __name__ == '__main__':
dm_插入节点()