【剑指offer - 树】 按之字形顺序打印二叉树

【剑指offer - 树】 按之字形顺序打印二叉树

原题链接: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 异常。

你可能感兴趣的:(数据结构与算法,java,算法,数据结构)