按之字形顺序打印二叉树

本文介绍了如何按之字形顺序打印二叉树,包括两种实现方式:一种利用collections工具类反转,另一种使用栈进行操作。第一种方法被评价为更优。
摘要由CSDN通过智能技术生成

题目描述

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

 

第一种思路:也是从左到右来进行遍历,只不过是在该反转的时候用collections工具类进行反转,代码如下:

   

public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
    ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
    Queue<TreeNode> queue = new LinkedList<>();
    queue.add(pRoot);
    boolean reverse = false;
    while (!queue.isEmpty()) {
        ArrayList<Integer> list = new ArrayList<>();
        int cnt = queue.size();
        while (cnt-- > 0) {
            TreeNode node = queue.poll();
            if (node == null)
                continue;
            list.add(node.val);
            queue.add(node.left);
            queue.add(node.right);
        }
        if (reverse)
            Collections.reverse(list);
        reverse = !reverse;
        if (list.size() != 0)
            ret.add(list);
    }
    return ret;
}

    

第二种方法是用到stack栈:

package cn.cqu.edu;

import java.util.ArrayList;
import java.util.Stack;


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

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

	    }

	}
	
    public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
    	
    	ArrayList<Integer> ele=new ArrayList<Integer>();
    	ArrayList<ArrayList<Integer>> list=new ArrayList<ArrayList<Integer>>();
    	
    	
    	if(pRoot==null)
    	{
    		return list;
    	}
    	
    	int i=0;  //奇数表示从左到右,偶数表示从右到左,注意这里描述的是进栈的顺序
    	
    	Stack<TreeNode> previousStack1=new Stack<>();
    	
    	
    	previousStack1.push(pRoot);
    	
    	while(!previousStack1.isEmpty())
    	{
    		Stack<TreeNode> currentStack2=new Stack<>();
    		i++;
    		ArrayList<Integer> e=new ArrayList<Integer>();
    		int n=previousStack1.size();
    		if(i%2==0)  //从右到左
    		{
    			while(!previousStack1.isEmpty())
    			{
    				TreeNode node=previousStack1.pop();
    				e.add(node.val);
    				if(node.right!=null)
    				{
    					currentStack2.add(node.right);
    				}
    				if(node.left!=null)
    				{
    					currentStack2.add(node.left);
    				}
    			}
    		}
    		else
    		{
    			while(!previousStack1.isEmpty())
    			{
    				TreeNode node=previousStack1.pop();
    				e.add(node.val);
    				if(node.left!=null)
    				{
    					currentStack2.add(node.left);
    				}
    				if(node.right!=null)
    				{
    					currentStack2.add(node.right);
    				}
    			}
    		}
    		
    		list.add(e);
    		previousStack1=currentStack2;
    		
    	}
         
    	return list; 
    }

	public static void main(String[] args) {
		

	}

}

第二种方法不如第一种好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值