LeetCode题目:之字形打印二叉树

本文介绍了一种特殊的二叉树层次遍历算法——之字形打印。该算法按从左到右、从右到左交替的方式打印二叉树各层节点。文章通过实例详细解析了解题思路,并提供了Java代码实现。

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

题目描述:

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

例如:
给定二叉树: [3,9,20,null,null,15,7],
在这里插入图片描述
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]

提示:

节点总数 <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

这道题在分层从上到下打印二叉树的题目的思路上出发就很容易了,不难看出奇数行,是从左到右地打印列表,而偶数行是从右到左打印列表,所以在分层从上到下打印二叉树的基础上,在每行打印前添加一个flag,如果flag为true,则顺序打印列表,如果flag为false,则逆序打印列表,每一行处理后flag取反。
代码:(Java)

public class questionthree {
	public static void main(String[] args) {
		TreeNode root = new TreeNode(8);
		root.left = new TreeNode(6);
		root.right = new TreeNode(10);
		root.left.left = new TreeNode(5);
		root.left.right = new TreeNode(7);
		root.right.left = new TreeNode(9);
		root.right.right = new TreeNode(11);
		List<List<Integer>> res = new ArrayList<>();
		res = levelOrder(root);
		for(int i = 0; i<res.size();i++){
			System.out.println(res.get(i));
		}
	}

	public static List<List<Integer>> levelOrder(TreeNode root){
		List<List<Integer>> ans = new ArrayList<>();
		if(root == null) return ans;
		Queue<TreeNode> queue = new LinkedList<>();
		queue.add(root);//把根节点放进队列,开始程序
		boolean flag = true;  //控制列表是顺序还是逆序的标志
		while(!queue.isEmpty()){ //如果队列不是空的,说明二叉树不会遍历完,如果有下一层,会在当前这层往队列里加入下一层的节点
			int size = queue.size(); //首先得到当前要这一层要处理的节点数
			List<Integer> curlevel = new ArrayList<>(); //初始化用来放当前这层节点的值的容器
			while(--size >= 0){  //按照要处理节点的个数来处理
				TreeNode cur = queue.remove();  //每处理一个节点,就把一个节点移出队列
				curlevel.add(cur.val);  //同时把要处理节点的值放进当前层的容器中
				if(cur.left != null) queue.add(cur.left);  //如果当前节点有左右子节点,就加入到队列中
				if(cur.right != null) queue.add(cur.right);
			}
			if(flag == false) {  //如果标志位false,将列表逆序
				Collections.reverse(curlevel);
			}
			ans.add(curlevel);
			flag = !flag;  //下一层,flag取反
		}
		
		return ans;
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值