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;
        }
    }

     











  • 相关阅读:
    Yeelink 初探
    Macbook被格式化之后
    linux 代码分析工具 gprof
    Writing Clean Code 读后感
    0 bug 读后感
    STM32 控制红外线收发
    HomeKit 与老旧设备
    树莓派控制红外线收发
    苹果没法删除部分照片的问题
    route处理
  • 原文地址:https://www.cnblogs.com/lisen10/p/11559930.html
Copyright © 2011-2022 走看看