天天看點

劍指offer: 按之字形順序列印二叉樹(避免坑)

題目描述

請實作一個函數按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。

思路:

1、實作之字形列印二叉樹,需要對每一層的結點進行分類,同時其列印的順序也是需要從左往右、或者從右往左都是需要根據其具體的層數進行判斷的;

2、對于在每次出棧或者入棧的時候,需要對棧進行判斷,對結點是否具有子節點進行判斷,否則得到的ArrayList會有[ ];

3、注意在棧中操作的是結點,在ArrayList中操作的是結點的值val;

import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> list =new  ArrayList<ArrayList<Integer> >();
        if(pRoot==null) return list;
        Stack<TreeNode>  s1=new Stack<TreeNode>();
        Stack<TreeNode>  s2=new Stack<TreeNode>();
        s1.push(pRoot);
        int count=1;
        while(!s1.empty() || !s2.empty()){
            if(count%2!=0){
                ArrayList<Integer>  arr=new ArrayList<Integer>();
                while(!s1.empty()){
                    TreeNode node=s1.pop();
                    if(node != null) {
                        arr.add(node.val);
                        s2.push(node.left);
                        s2.push(node.right);
                    }
                }
               if (!arr.isEmpty()) {
                    list.add(arr);
                    count++;
                }
            }else{
                 ArrayList<Integer>  arr=new ArrayList<Integer>();
                 while(!s2.empty()){
                    TreeNode node=s2.pop();
                    if(node != null) {
                        arr.add(node.val);
                        s1.push(node.right);
                        s1.push(node.left);
                      }
                 }
                 if (!arr.isEmpty()) {
                    list.add(arr);
                    count++;
                }
            }
        }
        
     return list;
    }

}
           

繼續閱讀