牛客网编程高频题21——NC14二叉树的之字形层序遍历

目录

二叉树的之字形层序遍历

描述

示例1

输入

返回值

备注

方法一:递归

方法二:队列


 

 

二叉树的之字形层序遍历

描述

给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替),

例如:给定的二叉树是{3,9,20,#,#,15,7},

该二叉树之字形层序遍历的结果是:

[

[3],

[20,9],

[15,7]

]

 

示例1

输入

{1,#,2}

返回值

[[1],[2]]

 

备注

二叉树的数据结构为:

public class TreeNode {
  int val = 0;
  TreeNode left = null;
  TreeNode right = null;
}

 

方法一:递归

递归将每一层的信息添加到对应层的列表中,

import java.util.*;

public class Solution {
    public ArrayList<ArrayList<Integer>> zigzagLevelOrder (TreeNode root) {
        // write code here
        ArrayList<ArrayList<Integer>> arrayLists=new ArrayList<>();
        return levelTraversal(root,0,arrayLists);
    }
    
    public ArrayList<ArrayList<Integer>> levelTraversal (TreeNode root,int level,ArrayList<ArrayList<Integer>> arrayLists) {
        // write code here
        if(root==null){
            return arrayLists;
        }
        ArrayList<Integer> arr;
        try{
            arr=arrayLists.get(level);
        }catch (Exception e) {
            arr = new ArrayList<>();//在第一次遍历到当前层时新建列表
            arrayLists.add(arr);//将列表添加到当前层队列
        }

        if(level%2==0) {
            arr.add(root.val);//向后插入
        }else{
            arr.add(0,root.val);//向前插入
        }
        arrayLists.set(level,arr);
        arrayLists=levelTraversal(root.left,level+1,arrayLists);
        arrayLists=levelTraversal(root.right,level+1,arrayLists);
        return arrayLists;
    }
}

因为第一次访问新层时列表中没有元素,所以这里用异常进行捕获处理,时间消耗还行

 

方法二:队列

逐层遍历每个节点,将子树添加到下层节点中,

import java.util.*;

public class Solution {
    public ArrayList<ArrayList<Integer>> zigzagLevelOrder (TreeNode root) {
        // write code here
        ArrayList<ArrayList<Integer>> arrayLists=new ArrayList<>();
        Queue<TreeNode> nodes=new LinkedList<>();
        if(root!=null){
            nodes.add(root);
        }

        int level=0;
        while(!nodes.isEmpty()){
            int curLevelNum=nodes.size();//当前层数节点的个数
            ArrayList<Integer> temp=new ArrayList<>();
            for (int i = 0; i < curLevelNum; i++) {//遍历当前层的所有节点
                TreeNode node=nodes.poll();
                if(level%2==0){
                    temp.add(node.val);//从后插入
                }else{
                    temp.add(0,node.val);//从前插入
                }
                
                if(node.left!=null){
                    nodes.add(node.left);//左子树不为空添加到下一层节点中
                }
                if(node.right!=null){
                    nodes.add(node.right);//右子树不为空添加到下一层节点中
                }
            }
            arrayLists.add(temp);
            level++;
        }
        return arrayLists;
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值