zoukankan      html  css  js  c++  java
  • 剑指:之字形打印二叉树

    题目描述

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

    如二叉树:

                1
        	   /  
        	  2    3
        	 /    / 
        	4  5   6  7
    

    打印结果为:

    1
    3 2
    4 5 6 7


    解法

    之字形打印,即先从左到右,后从右到左,借助栈结构实现;

    两个辅助栈:一个存放奇数层节点的栈s1,一个存放偶数层节点的栈s2

    s1栈中的节点弹出,其节点的 左->右 孩子进s2栈;

    s2栈中的节点弹出,其节点的 右->左 孩子进s1栈;

    出栈的顺序就是打印的顺序。

    import java.util.ArrayList;
    import java.util.Stack;
    
    /*
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
    
        public TreeNode(int val) {
            this.val = val;
    
        }
    
    }
    */
    public class Solution {
        public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
            ArrayList<ArrayList<Integer>> res = new ArrayList<>();
            if(pRoot==null){
                return res;
            }
            
            Stack<TreeNode> s1 = new Stack<>();
            Stack<TreeNode> s2 = new Stack<>();
            
            s1.push(pRoot);
            int layer = 1;
            
            while(!s1.isEmpty() || !s2.isEmpty()){
                
                if(layer%2 != 0){ //奇数层
                    ArrayList<Integer> list = new ArrayList<>();
                    while(!s1.isEmpty()){
                        TreeNode node = s1.pop();
                        if(node != null){
                            list.add(node.val); //
                            s2.push(node.left);
                            s2.push(node.right);
                        }
                    }
                    if(!list.isEmpty()){
                        res.add(list);
                        layer++;
                    }
                }else{//偶数层
                    ArrayList<Integer> list = new ArrayList<>();
                    while(!s2.isEmpty()){
                        TreeNode node = s2.pop();
                        if(node != null){
                            list.add(node.val); //
                            s1.push(node.right);
                            s1.push(node.left);
                        }
                    }
                    if(!list.isEmpty()){
                        res.add(list);
                        layer++;
                    }
                }
            }
                
            return res;
        }
    }

     











  • 相关阅读:
    提升Android编译速度
    NYOJ 158 省赛来了
    浅谈 ZipArchive 类
    块状元素的text-align对齐属性
    BestCoder Round #2 1001 TIANKENG’s restaurant
    Saltstack运行cmd.run重新启动tomcat后出现日志乱码(15)
    【HRS项目】Axure兴许问题解决---与SVN结合
    软件质量之道:PCLint之中的一个
    字典树 一种高速插入查询数据结构
    【JS】JavaScript引擎的内部执行机制
  • 原文地址:https://www.cnblogs.com/lisen10/p/11559930.html
Copyright © 2011-2022 走看看