剑指Offer刷题笔记——从上往下打印二叉树

从上往下打印出二叉的每个节点,同层节点从左至右打印。

其实这就是广度搜索。

与广度搜索对应的是深度搜索,所谓深度搜索就是前序遍历,除了常见的递归实现之外,还可以利用栈来实现:利用,先将根入栈,再将根出栈,并将根的右子树,左子树存入栈,按照先进后出规则来实现深度优先遍历。深度优先搜索不能用都队列来实现,比如一个结点出队列了,它的子树在队尾入队列,就不能紧接着出队列了。

def DFS_STACK(self,root):      #基于栈数据结构实现的深度遍历        
    if root == None:            
        return        
    stack = []        
    stack.append(root)        
    while stack:            
        now_node = stack.pop()            
        print(now_node.data)            
        if now_node.right != None:                
            stack.append(now_node.right)            
        if now_node.left != None:                
            stack.append(now_node.left)

相对的广度优先搜索就是层次遍历,所谓层次遍历就是把一棵二叉树当成千层饼,吃的时候是一层一层的吃。

广度搜索可以用队列实现,广度优先搜索首先是上面的层要先输出,所以处在上面的要先进队列。在同一层中,左边的结点要先输出所以同一层里左边的结点要先进队列。

这个过程,进出队列是同时进行的。一个结点出队列,它的两个子结点(不管是不是空结点)就进队列。

这个过程怎么理解? 一个结点在它自己这层的出队列次序,代表着它的子结点在下一层的出队列次序。如果把出对列和入队列看成一次遍历的话,父节点出队列的同时,子结点就应该入队列。

换句话解释:如果这个队列只入队列不出队列,当一层入完了,下一层该怎么入?应该是把上一层的结点再找出来,依次把他们的子结点在入队列。这个再找出来的操作就是出队列。


def PrintFromTopToBottom(self, root):        
    # write code here
    # 存储数值的队列        
    res = []       
    # 存储结点的队列 
    queue = [root]                 
    while queue:            
        node = queue.pop(0) 
        # 因为不是完全二叉树,有空的跳过           
        if node == None:                
            continue            
        res.append(node.val)   
        # 子结点入队列         
        queue += [node.left, node.right]        
    return res


 

   

   

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值