剑指offer刷题0409

本文介绍了一种特殊的二叉树打印方法——之字形打印。通过使用两个栈交替存储奇数层和偶数层节点,实现了从左到右、从右到左交替打印的层次遍历算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

按之字形打印二叉树

 

按之字形打印二叉树

问题
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

思路:类似层级遍历二叉树 的做法,只不过现在需要根据层的奇偶来改变加入的顺序,不能只简简单单用一个队列来解决了。

先来分析一下如图,第0层,先a,然后将a的右c-左b加入下一层;第1层,依次上一次已经加入的序列,打印输出c,b,但注意的是却需要先将b的左d-右e加入下一层才能将c的左f右g加入下一层(此时加入的是当前打印顺序的逆序)。也就是说,在这一层时,打印的顺序 和 遍历节点并将节点孩子加入下一层 的顺序,是相反着的。这点特别要注意。 然后就可以循环着来做了,这里使用了两个list交替存储奇数层和偶数层。
对于每层,要做的事情可以看成两部分:一位打印当前层的序列,二为将当前序列的子节点加入到待打印的序列中去。

 

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Print(self, pRoot):
        if not pRoot:
            return []
        result = []
        stack = [[pRoot], []]#建立两个列表,一个偶数列stack[0],一个奇数列stack[1]
        current = 0#用来判别下标为奇数还是偶数的变量
        while stack[0] or stack[1]:
            if current == 0:#偶数下标
                #打印,当前偶数下标层,按list中顺序打印元素
                result.append([p.val for p in stack[0]])
                 #加入下一层。逆序遍历打印序列,将每个元素的 右 -左 先后加入下一层
                for i in range(len(stack[0])-1, -1, -1):
                    p = stack[0][i]
                    if p.right: #先加右边
                        stack[1].append(p.right)
                    if p.left:#再加左边的
                        stack[1].append(p.left)
                stack[0] = []
            else:#奇数
                  #当前奇数下标层,先打印元素(打印都是顺序打印,只是加的时候要注意)
                result.append([p.val for p in stack[1]])
                # 然后逆序遍历,并将每个元素的 左-右 先后加入下一层
                for i in range(len(stack[1])-1, -1, -1):
                    p = stack[1][i]
                    if p.left:
                        stack[0].append(p.left)
                    if p.right:
                        stack[0].append(p.right)
                stack[1] = []
            current = 1 - current
        return result

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值