剑指Offer:按之字形顺序打印二叉树Java/Python

1.题目描述

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

2.算法描述

用两个栈搞定超级简单,栈是起反序作用的。

1. 初 始 化 两 个 栈 s 1 , s 2 , s 1 用 来 装 奇 数 层 的 结 点 , s 2 用 来 装 偶 数 层 的 结 点 。 初 始 化 一 个 a n s 用 来 装 最 终 的 答 案 。 1.初始化两个栈s1,s2,s1用来装奇数层的结点,s2用来装偶数层的结点。初始化一个ans用来装最终的答案。 1.s1,s2s1s2ans
2. 初 始 时 , 根 节 点 入 栈 s 1. 2.初始时,根节点入栈s1. 2.s1.
3. 当 s 1 , s 2 有 一 个 不 为 空 时 , 执 行 以 下 操 作 : 3.当s1,s2有一个不为空时,执行以下操作: 3.s1s2
     3.1. 初 始 化 一 个 临 时 l i s t 用 来 装 s 1 中 的 结 点 , 当 s 1 不 空 时 , 弹 出 s 1 中 结 点 时 , \red{\ \ \ \ 3.1.初始化一个临时list用来装s1中的结点,当s1不空时,弹出s1中结点时,}     3.1.lists1s1s1,
        将 结 点 值 装 入 临 时 l i s t , 将 结 点 的 子 结 点 以 “ 左 右 ” 的 顺 序 入 栈 s 2 ; 然 后 临 时 l i s t 加 入 到 a n s 中 \red{\ \ \ \ \ \ \ 将结点值装入临时list,将结点的子结点以“左右”的顺序入栈s2;然后临时list加入到ans中}        list,s2;listans
则 s 2 中 的 结 点 出 栈 的 时 候 是 从 偶 数 层 的 最 右 端 开 始 以 " 右 左 " 的 顺 序 弹 出 的 。 则s2中的结点出栈的时候是从偶数层的最右端开始以"右左"的顺序弹出的。 s2""
     3.2. 初 始 化 一 个 临 时 l i s t 用 来 装 s 2 中 的 结 点 , 当 s 2 不 空 时 , 弹 出 s 2 中 结 点 时 , \red{\ \ \ \ 3.2.初始化一个临时list用来装s2中的结点,当s2不空时,弹出s2中结点时,}     3.2.lists2s2s2
         将 结 点 值 装 入 临 时 l i s t , 将 结 点 的 子 结 点 以 “ 右 左 ” 的 顺 序 入 栈 s 1 ; 然 后 临 时 l i s t 加 入 到 a n s 中 \red{\ \ \ \ \ \ \ \ 将结点值装入临时list,将结点的子结点以“右左”的顺序入栈s1;然后临时list加入到ans中}         list,s1;listans
则 s 1 中 的 结 点 出 栈 的 时 候 是 从 奇 数 层 的 最 左 端 开 始 以 " 左 右 " 的 顺 序 弹 出 的 。 则s1中的结点出栈的时候是从奇数层的最左端开始以"左右"的顺序弹出的。 s1""

3.代码描述

3.1.Java代码


/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }

}
*/
import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
        if(pRoot==null)
            return ans;
        Stack<TreeNode> s1 = new Stack<>();//装奇数层的结点
        Stack<TreeNode> s2 = new Stack<>();//装偶数层的结点
        s1.push(pRoot);
        ArrayList<Integer> row = null;
        while(!s1.isEmpty()||!s2.isEmpty()){
            row = new ArrayList<>();
            while(!s1.isEmpty()){
                TreeNode node = s1.pop();
                row.add(node.val);
                //以“左右”的顺序入栈
                if(node.left!=null)
                    s2.push(node.left);
                if(node.right!=null)
                    s2.push(node.right);
            }
            if(!row.isEmpty())
                ans.add(row);
            row = new ArrayList<>();
            while(!s2.isEmpty()){
                TreeNode node = s2.pop();
                row.add(node.val);
                //以“右左”的顺序入栈
                if(node.right!=null)
                    s1.push(node.right);
                if(node.left!=null)
                    s1.push(node.left);
            }
            if(!row.isEmpty())
                ans.add(row);
        }
        return ans;
    }

}

3.2.Python代码

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Print(self, pRoot):
        ans = []
        if not pRoot:
            return ans
        s1 = []
        s2 = []
        s1.append(pRoot)
        while s1 or s2:
            row = []
            while s1:
                node = s1.pop()
                row.append(node.val)
                if node.left:
                    s2.append(node.left)
                if node.right:
                    s2.append(node.right)
            if row:
                ans.append(row)
            row = []
            while s2:
                node = s2.pop()
                row.append(node.val)
                if node.right:
                    s1.append(node.right)
                if node.left:
                    s1.append(node.left)
            if row:
                ans.append(row)
        return ans
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值