剑指offer59 按之字形打印二叉树


剑指offer59

按之字形打印二叉树

题目描述

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

示例

输入

{8,6,10,5,7,9,11}

输出

[[8],[10,6],[5,7,9,11]]

思路

1.利用一个栈一个队列实现,奇数用队列,偶数层用栈

2.利用两个栈实现

代码

利用两个栈实现

import java.util.ArrayList;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.Stack;
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        int layer = 1;    //层数
        //结果集
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        //s1保存奇数层
        Stack<TreeNode> s1 = new Stack<TreeNode>();
        s1.push(pRoot);
        //s2保存偶数层节点
        Stack<TreeNode> s2 = new Stack<TreeNode>();
        while(!s1.empty() || !s2.empty()){
            ArrayList<Integer> temp = new ArrayList<>();
            if(layer%2 != 0){    //奇数层
                while(!s1.empty()){
                    TreeNode node = s1.pop();
                    if(node!=null){
                        temp.add(node.val);
                        //下一层偶数层节点压入s2
                        s2.push(node.left);
                        s2.push(node.right);
                    }
                }
            }else{    //偶数层
                while(!s2.empty()){
                    TreeNode node = s2.pop();
                    if(node!=null){
                        temp.add(node.val);
                        //下一层奇数层节点压入s1,注意顺序
                        s1.push(node.right);
                        s1.push(node.left);
                    }
                }
            }
            if(!temp.isEmpty()){
                    res.add(temp);
                    layer++;
            }
        }
        return res;
    }
}
/*
思路:
1.利用一个栈一个队列实现,奇数用队列,偶数层用栈
2.利用两个栈实现
本代码利用两个栈实现:以  8,6,10,5,7,9,11为例
    1.首先将奇数层根节点8压入栈1,同时将根节点的左、右孩子6和10依次压入栈2,然后,s1为空,层数加一,进入下一层
    2.第二层偶数层,先将s2的节点10弹出,同时把10的右、左孩子11和9依次压入栈1,然后把节点6弹出,把6的右、左孩子7和5依次压入栈1
    3.第三层奇数层,按照第二层的入栈顺序反向弹出,依次弹出5,7,9,11
*/

文章作者: Hailong Gao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Hailong Gao !
评论
  目录