python:二叉树的概念、广度优先遍历和深度优先遍历
·
一、概念(单列了几个重点概念)
树:一种一对多的数据结构;
节点的度:结点上的子节点个数;

二、树的分类
树分成多叉树和二叉树(重点是二叉树:每个根节点最多有两个子树的树),二叉树又分成完全二叉树(里面包括满二叉树)、排序二叉树、平衡二叉树等;
注意:因为大多数二叉树不是满二叉树和完全二叉树,所以树的存储基本是以链式结构存储的,而存储时是通过存储值和节点关系进行的。

三、二叉树的两种遍历方式:广度优先遍历和深度优先遍历
(一)广度优先遍历:按照层级遍历
(二)深度优先遍历:共三种情况;
先序:根节点-左节点-右节点
中序:左节点-根节点-右节点
后序:左节点-右节点-根节点
具体代码如下:
例:
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)
return
else:
queue.append(node.lchild)
if node.rchild == None:
node.rchild = Node(item)
return
else:
queue.append(node.rchild)
def breadh_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 preorder_travel(self, root):
"""先序遍历: 根 左 右"""
if root is not None:
# 先访问根节点
print(root.item, end="")
# 递归再访问左子树
self.preorder_travel(root.lchild)
# 递归访问右子树
self.preorder_travel(root.rchild)
def inorder_travel(self, root):
"""中序遍历 :左 根 右"""
if root is not None:
self.inorder_travel(root.lchild)
print(root.item, end="")
self.inorder_travel(root.rchild)
def postorder_travel(self, root):
"""后序遍历 :根 左 右"""
if root is not None:
self.postorder_travel(root.lchild)
self.postorder_travel(root.rchild)
print(root.item, end="")
if __name__ == '__main__':
tree = BinaryTree()
tree.add("0")
tree.add("1")
tree.add("2")
tree.add("3")
tree.add("4")
tree.add("5")
tree.add("6")
tree.add("7")
tree.add("8")
tree.add("9")
tree.preorder_travel(tree.root)
print()
tree.inorder_travel(tree.root)
print()
tree.postorder_travel(tree.root)
更多推荐
所有评论(0)