剑指Offer-56——按之字形顺序打印二叉树

题目描述

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

思路解析

  1. 每两层各自都有自己的打印的顺序,所以需要考虑如何如何将第一层的打印完了,然后第二层的从另外一个方向进行打印。而且需要将特定的节点顺序传给下一层。因此这里考虑使用两个栈来存储,第一个栈stack1存储第一层打印的顺序,可以记做奇数层打印顺序。第二个栈Stack2存储第二层的打印顺序,可以记做偶数层的打印顺序。在每层遍历完后就pop出遍历过的节点。

代码

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>> result = new ArrayList<>();
     if(pRoot == null) return result;
        ArrayList<Integer> singlePath = new ArrayList<>();
     Stack<TreeNode> stack1 = new Stack<>();//用于存储奇数层的节点
     Stack<TreeNode> stack2 = new Stack();//用于存储偶偶数节点
     stack1.push(pRoot);
     while(!stack1.isEmpty()||!stack2.isEmpty()){
    
    
        while(!stack1.isEmpty()){
    
    
            TreeNode tempNode = stack1.peek();
            singlePath.add(tempNode.val);
            //将它的子树结点保存到stack2,从左往右
            if(tempNode.left!=null){
    
    
                stack2.push(tempNode.left);
            }
            if(tempNode.right!=null){
    
    
                stack2.push(tempNode.right);
            }
            //将stack1中的节点抛出
            stack1.pop();
        }
         //先将一层的数据存入result中
         if(!singlePath.isEmpty()){
    
    
             result.add(singlePath);
             singlePath = new ArrayList<>();
         }
         //开始偶数行的数据
         while(!stack2.isEmpty()){
    
    
             TreeNode tempNode = stack2.peek();
             singlePath.add(tempNode.val);
             //将第二层的下一层子树结点加入到stack1中(奇数层加入进去)
             if(tempNode.right!=null){
    
    
                 stack1.push(tempNode.right);
             }
             if(tempNode.left!=null){
    
    
                 stack1.push(tempNode.left);
             }
             stack2.pop();
         }
         if(!singlePath.isEmpty()){
    
    
             result.add(singlePath);
             singlePath = new ArrayList<>();
         }
     }
        return result;
    }

}

猜你喜欢

转载自blog.csdn.net/H1517043456/article/details/107590676