《剑指offer》——按之字形顺序打印二叉树

60 篇文章 3 订阅

更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~

T:

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

这道题目与前几天做的一道题目《把二叉树打印成多行》类似,只不过拿到题目里,把每一层的节点都保存在一个单独数组当中,这道题目中,需要按照“之”字形保存,很简单,用个flag标记一下就能做到。

我的code:

    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Queue;
    /*
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
    
        public TreeNode(int val) {
            this.val = val;
    
        }
    
    }
    */
    
    /**
     * T: 按之字形顺序打印二叉树
     * 
     * 题目描述 
     * 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,
     * 第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
     * 
     * date: 2015.12.4  14:01
     * @author SSS
     *
     */
    public class Solution {
        public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
    
            ArrayList<ArrayList<Integer>> resultsList = new ArrayList<ArrayList<Integer>>();
    		
    		if (pRoot == null) {
    			return resultsList;
    		}
    		
    		Queue<TreeNode> listQueue = new LinkedList<TreeNode>();
    		listQueue.add(pRoot);
    		
    		int preCount = 1;	// 本层的总长度
    		int curCount = 0;	// 当前已经遍历的个数
    		int nextCount = 0;	// 下一层的个数计数
    		
    		// 收集每一层的数组
    		List<Integer> layerList = new ArrayList<Integer>();
    		boolean flag = true;	// 正向还是反向收集
    		while (!listQueue.isEmpty()) {
    			TreeNode tempNode = listQueue.poll();
    			layerList.add(tempNode.val);
    			curCount ++;
    			
    			if (tempNode.left != null) {
    				listQueue.add(tempNode.left);
    				nextCount ++;
    			}
    			
    			if (tempNode.right != null) {
    				listQueue.add(tempNode.right);
    				nextCount ++;
    			}
    			// 看是否已经遍历完一层了
    			if (curCount == preCount) {
    				preCount = nextCount;
    				curCount = 0;
    				nextCount = 0;
    				
    				ArrayList<Integer> arrList = this.posiOrNegaCollection(layerList, flag);
    				// 清空layerList数组
    				layerList.clear();
    				// 改变flag属性
    				if (flag) {
    					flag = false;
    				} else {
    					flag = true;
    				}
    				resultsList.add(arrList);
    			}
    		}
    		
    		return resultsList;
        }
        
        /**
    	 * 正向(反向)收集
    	 * @param layerList
    	 * @param flag
    	 * @return
    	 */
    	public ArrayList<Integer> posiOrNegaCollection(List<Integer> layerList, boolean flag) {
    		ArrayList<Integer> arrList = new ArrayList<Integer>();
    		// 正向
    		if (flag) {
    			for (int i = 0; i < layerList.size(); i++) {
    				arrList.add(layerList.get(i));
    			}
    		} else { // 反向
    			for (int i = layerList.size() - 1; i > -1; i--) {
    				arrList.add(layerList.get(i));
    			}
    		}
    		
    		return arrList;
    	}
    
    }

更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值