树的广度优先遍历python_python---二叉树广度优先和深度优先遍历的实现

class Node(object):

"""结点"""

def __init__(self, data):

self.data = data

self.lchild = None

self.rchild = None

class BinaryTree(object):

"""二叉树"""

def __init__(self, node=None):

self.root = node

def is_empty(self):

"""判断是否为空树"""

return self.root is None

def add(self, item):

"""在树的最后添加结点"""

# 要添加的结点

node = Node(item)

# 空树

if self.root is None:

self.root = node

return

# 存放结点的队列, 从根结点开始

queue = [self.root]

while queue:

cur_node = queue.pop(0)

# 根结点的左孩子为空, 直接添加

if cur_node.lchild is None:

cur_node.lchild = node

return

# 根结点的左孩子不为空, 添加到结点队列

else:

queue.append(cur_node.lchild)

# 根结点的右孩子为空, 直接添加

if cur_node.rchild is None:

cur_node.rchild = node

return

# 根结点的右孩子不为空, 添加到结点队列

else:

queue.append(cur_node.rchild)

def breadth_travel(self):

"""广度优先遍历"""

if self.root is None:

return

# 存放树结点的队列

queue = [self.root]

# 左右孩子均不为空,不进队列, 只弹出结点, 队列为空时结束

while queue:

# 弹出当前结点

cur_node = queue.pop(0)

print(cur_node.data, end=" ")

# 左孩子不为空, 进队列

if cur_node.lchild is not None:

queue.append(cur_node.lchild)

# 右孩子不为空, 进队列

if cur_node.rchild is not None:

queue.append(cur_node.rchild)

def pre_order(self, node):

"""前序遍历, 根左右"""

if node is None:

return

print(node.data, end=" ")

self.pre_order(node.lchild)

self.pre_order(node.rchild)

def in_order(self, node):

"""中序遍历, 左根右"""

if node is None:

return

self.in_order(node.lchild)

print(node.data, end=" ")

self.in_order(node.rchild)

def post_order(self, node):

"""后序遍历, 左右根"""

if node is None:

return

self.post_order(node.lchild)

self.post_order(node.rchild)

print(node.data, end=" ")

if __name__ == '__main__':

tree = BinaryTree()

print(tree.is_empty())

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.breadth_travel() # 0 1 2 3 4 5 6 7 8 9

print()

tree.pre_order(tree.root) # 0 1 3 7 8 4 9 2 5 6

print()

tree.in_order(tree.root) # 7 3 8 1 9 4 0 5 2 6

print()

tree.post_order(tree.root) # 7 8 3 9 4 1 5 6 2 0

print()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值