二叉树的分层遍历

今天去面试的时候被问到二叉树的分层遍历,因为原来写python脚本的时候自己用队列的方法写过一次 分层遍历。结果面试官说能不能用递归的方法,不用队列实现。唔,临时想没有想起来,因此记录一下。

        

先定义一个二叉树的节点:

class TreeNode:
    def __init__(self,value):
        self.value=value
        self.left=None
        self.right=None

遍历算法为

def traverse(node):
    '''将要遍历的根节点放入队列中,并放入一个结束的标志位'''
    if node is None:
        return
    q=Queue.Queue()
    q.put(node)
    q.put(Sign())
    traverse_re(q)

def traverse_re(queue):
    node=queue.get()
    if node is None or isinstance(node, Sign):
        return
    while(not isinstance(node, Sign)):
        print node.value,
        #将左右子树放入队列中
        if node.left is not None:
            queue.put(node.left)
        if node.right is not None: 
            queue.put(node.right)
        node=queue.get()
    print ''
    queue.put(Sign())
    traverse_re(queue)

验证:

if __name__=="__main__":
    root=TreeNode(1)
    left=TreeNode(2)
    right=TreeNode(3)
    root.left,root.right=left,right
    left.left=TreeNode(4)
    right.left,right.right=TreeNode(6),TreeNode(7)
    traverse(root)
验证可以输出正确的结果。


在《编程之美》上看到了不使用队列的递归遍历方法:

#输出以root为根节点的第level层中的所有的节点,成功则返回1,失败返回0
def nodeAtLevel(node, level):
    if node is None or level <0:
        return 0
    if level==0:
        print node.value,
        return 1
    return nodeAtLevel(node.left, level-1)+nodeAtLevel(node.right, level-1)
    
def nodeByLevel(root):
    level=0
    while(True):
        if(nodeAtLevel(root, level)==0):
            break
        level+=1
        print ""
    
不过还是使用队列遍历的效率高,时间复杂度低




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值