【二叉树】 按之字形顺序打印二叉树

【二叉树】 按之字形顺序打印二叉树

原题链接:JZ77 按之字形顺序打印二叉树(看题解)

1、解题思路

使用队列和栈处理每一层的节点

  • 使用队列依次存储i层的节点;
  • 在插入第i层某节点的左右孩子节点之前,先将队列中的节点转移至栈中
  • 弹出栈顶节点,根据height = i + 1,决定是先插入左子树还是右子树。
  • 遍历结束条件为队列为空。

2、代码实现

import java.util.*;
import java.util.ArrayList;

/*
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>> results = new ArrayList<ArrayList<Integer>>();
        LinkedList<TreeNode> list = new LinkedList<TreeNode>();
        if(pRoot == null) return results;
        
        int height = 0;
        list.add(pRoot);
        while(!list.isEmpty()){
            
            LinkedList<TreeNode> stack = new LinkedList<TreeNode>();
            TreeNode rear = null; //该层中list的最尾节点
            //遍历并写入results
            ArrayList<Integer> temp = new ArrayList<Integer>();
            Iterator<TreeNode> iter = list.iterator();
            while(iter.hasNext()){
                TreeNode tn = iter.next();
                temp.add(tn.val);
                stack.add(tn);
                iter.remove();
            }
            results.add(temp);
            
            height += 1;
            
            TreeNode ptr = null;
            while(!stack.isEmpty()){
                ptr = stack.pollLast();
                if(height % 2 == 0){  //先插入左子树,再插入右子树
                    if(ptr.left != null) list.add(ptr.left);
                    if(ptr.right != null) list.add(ptr.right);
                }else{  
                    if(ptr.right != null) list.add(ptr.right);
                    if(ptr.left != null) list.add(ptr.left);
                }
            }
        }
        return results;
    }

}

注意在使用java同时进行队列遍历和删除操作时,要使用iter.next()iter.remove(),如果使用iter.next()list.poll()会抛出java.util.ConcurrentModificationException 异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值