python递归函数画树_在python类中实现树的递归函数

本文介绍了如何在Python中使用类和递归函数实现树的前序、中序和后序遍历。提供了一个Node和Tree类,包含插入数据和不同遍历方式的方法,并展示了测试用例。
摘要由CSDN通过智能技术生成

是的,您可以在单个函数中实现所有3种类型的遍历.我已经将遍历函数转换为生成器,以使它们更加通用.因此,它们不是打印数据,而是生成数据的迭代器.这使您可以在数据生成时处理数据,也可以将数据捕获到列表(或其他集合)中.

在Python 2中,您的类应该继承自object,否则您将获得旧式类,与新式类相比,它们相当有限(Python 3只有新式类).

顺便说一句,没有必要为私有函数(调用Python的name-mangling机制)使用双下划线,单个前导下划线就足够了.

我还在类中添加了简单的__repr__方法,这在开发过程中非常方便.调试.

class Node(object):

def __init__(self, data):

self.left = None

self.right = None

self.data = data

def __repr__(self):

return repr((self.data, self.left, self.right))

class Tree(object):

def __init__(self):

self.root = None

def __repr__(self):

return repr(self.root)

# Private helper functions

def _insert(self, data, root):

if data < root.data:

if root.left is None:

root.left = Node(data)

else:

self._insert(data, root.left)

else: # data >= root.data:

if root.right is None:

root.right = Node(data)

else:

self._insert(data, root.right)

def _traverse(self, root, mode):

if mode == 'pre':

yield root.data

if root.left:

for u in self._traverse(root.left, mode):

yield u

if mode == 'in':

yield root.data

if root.right:

for u in self._traverse(root.right, mode):

yield u

if mode == 'post':

yield root.data

# Wrapper Functions

def insert(self, data):

if self.root == None:

self.root = Node(data)

else:

self._insert(data, self.root)

def preOrder(self):

for u in self._traverse(self.root, 'pre'):

yield u

def inOrder(self):

for u in self._traverse(self.root, 'in'):

yield u

def postOrder(self):

for u in self._traverse(self.root, 'post'):

yield u

# Test

tree = Tree()

for elem in '31415926':

tree.insert(elem)

print tree

print "Preorder traversal: "

print list(tree.preOrder())

print "InOrder Traversal: "

print list(tree.inOrder())

print "PostOrder Traversal: "

print list(tree.postOrder())

产量

('3', ('1', None, ('1', None, ('2', None, None))), ('4', None, ('5', None, ('9', ('6', None, None), None))))

Preorder traversal:

['3', '1', '1', '2', '4', '5', '9', '6']

InOrder Traversal:

['1', '1', '2', '3', '4', '5', '6', '9']

PostOrder Traversal:

['2', '1', '1', '6', '9', '5', '4', '3']

以下是处理数据时的示例:

for data in tree.inOrder():

print data

FWIW,这段代码在Python 3中会更加清晰,因为我们可以使用语法的yield而不是for循环.而不是

for u in self._traverse(root.left, mode):

yield u

我们能做到

yield from self._traverse(root.left, mode)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值