[LeetCode]Binary Tree Zigzag Level Order Traversal

本文介绍了一种二叉树的锯齿形层序遍历算法,通过队列实现节点逐层访问,并根据层级奇偶性决定输出顺序,实现从左到右再从右到左交替输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).

For example:
Given binary tree {3,9,20,#,#,15,7},

    3
   / \
  9  20
    /  \
   15   7

return its zigzag level order traversal as:

[
  [3],
  [20,9],
  [15,7]
]

解题思路

此题和 Binary Tree Level Order Traversal II这道题几乎一样。
可以考虑使用Queue(队列)来实现。
队列为队首出队尾进,从队首remove一个元素,则应把它的所有子节点添加到队尾,直到队列中的所有元素均被remove为止。可以利用一个变量来记录每层的节点个数,作为获取下一层节点的弹出元素个数。
只是在最后反转一下队列即可。

或者不在最后反转而是控制进出队列的顺序,一层从左往右遍历,一层从右往左遍历输出。

代码

public  ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
		ArrayList<ArrayList<Integer>> levelList = new ArrayList<ArrayList<Integer>>();
	    
		//如果根节点为null则直接返回空的list
		if(root==null){
			return levelList;
		}
		
		Queue<TreeNode> queue = new LinkedList<TreeNode>();
		int len = 1;//队列初始长度为1,
		int cur = 1;//记录每层节点的个数
		
        queue.add(root);//添加根节点到队列中
        while(!queue.isEmpty()){
        	len = cur;
        	cur = 0;
        	
        	ArrayList<Integer> list = new ArrayList<Integer>();
        	for(int i = 0;i < len;i++){
        		TreeNode node = queue.peek(); 
        		if(node.left!=null){
        			cur++;
        			queue.offer(node.left);
        		}
        		if(node.right!=null){
        			cur++;
        			queue.offer(node.right);
        		}
        		list.add(node.val);
        		queue.remove();
        	}
        	
        	levelList.add(list);
        }

        int k = 0;
        for(ArrayList<Integer> list:levelList){
        	k++;
        	if(k==2){
        	   Collections.reverse(list);//逆转列表
        	   k = 0;
        	}
        }
		return levelList;
	}
如果想通过控制队列的出对顺序,可以考虑修改以下一段代码,通过添加变量k,来控制。这里就不列出来了。
for(int i = 0;i < len;i++){
        		TreeNode node = queue.peek(); 
        		if(node.left!=null){
        			cur++;
        			queue.offer(node.left);
        		}
        		if(node.right!=null){
        			cur++;
        			queue.offer(node.right);
        		}
        		list.add(node.val);
        		queue.remove();
        	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值