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

Posted *^O^*—*^O^*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer 按之字形顺序打印二叉树相关的知识,希望对你有一定的参考价值。

题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
在这里插入图片描述
题目链接

解题思路

首先可以看到,返回的是一个顺序表,接着我们可以采取层序遍历的方式,每一层构建一个顺序表加入到最终返回的顺序表中,但是这样得到的顺序表只有偶数层是正确的,奇数层是反着的,所以就需要对奇数层进行操作,代码一是自己写的操作,代码二是使用库函数的操作。

代码示例

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 static ArrayList<ArrayList<Integer> > result = new ArrayList<>();
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        result = new ArrayList<>();
        if(pRoot == null){
            return result;
        }
        helper(pRoot,0);
        for(int i = 0;i<result.size();i++){
            if(i%2 != 0){
               help(result.get(i));
            }
        }
        return result;
    }
    public void helper(TreeNode root,int level){
        if(level == result.size()){
            result.add(new ArrayList<>());
        }
        result.get(level).add(root.val);
        if(root.left != null){
            helper(root.left,level+1);
        }
        if(root.right != null){
            helper(root.right,level+1);
        }
    }
    public void help(ArrayList list){
        int[] arr = new int[list.size()];
        for(int i =0;i<list.size();i++){
            arr[i] = (int)list.get(i);
        }
        for(int i = 0;i<list.size();i++){
            list.set(i,arr[arr.length-1-i]);
        }
    }
}

第二种

import java.util.ArrayList;
import java.util.Collections;
/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

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

    }

}
*/
public class Solution {
    ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();
        depth(pRoot,1,list);
        for(int i=0;i<list.size();i++){
            if(i%2!=0){
                Collections.reverse(list.get(i));
            }
        }
        return list;
    }

    private void depth(TreeNode root, int depth, ArrayList<ArrayList<Integer>> list) {
       if(root==null)
           return;
       if(depth>list.size()){
           list.add(new ArrayList<Integer>());
       }
       list.get(depth-1).add(root.val);
       depth(root.left,depth+1,list);
       depth(root.right,depth+1,list);
    }

}

以上是关于剑指offer 按之字形顺序打印二叉树的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer-按之字形打印二叉树

剑指offer JZ77 按之字形顺序打印二叉树

剑指offer(五十三)之按之字形顺序打印二叉树

剑指offer 59.树 按之字形顺序打印二叉树

《剑指offer》:[61]按之字形顺序打印二叉树

剑指offer:按之字形顺序打印二叉树