网站首页 > 开源技术 正文
package com.company.二叉树;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class 二叉树数的Z字型遍历 {
    /**
     * 内部类
     */
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode() {}
        TreeNode(int val) { this.val = val; }
        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }
    /**
     * 广度优先解法
     * 思路分析:
     * 第一步:先进行边界值判断
     * 第二步:创建一个队列,入队根节点
     * 第三步:whlile循环出队
     * 第四步:重点:每次出队的时候会把左右节点进行入队,可以理解为入队了第二层的所有的节点,
     *  第二层出队时,把所有的节点拿出来之后,放入list中,然后把所有第二层节点的左右节点入队,
     *  这个地方要注意Z型遍历时,规律是偶数是从左到右,奇数是从右到左,
     *  所以用取余数来判断增加节点的数序, 然后就是第三层,依次循环处理,注意边界值的判断,
     *  如果是空的话就不用放入list中, 第五步:依次按循环的list增加到全局的list中返回。
     * @param root
     * @return
     */
    public List<List<Integer>> zLevelOrder(TreeNode root) {
        List<List<Integer>> list = new ArrayList<>();
        if (root == null) return list;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            ArrayList<Integer> res = new ArrayList<>();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                res.add(node.val);
                if (i%2 == 0) {
                    if (root.left != null) {
                        queue.offer(root.left);
                    }
                    if (root.right != null) {
                        queue.offer(root.right);
                    }
                } else {
                    if (root.right != null) {
                        queue.offer(root.right);
                    }
                    if (root.left != null) {
                        queue.offer(root.left);
                    }
                }
            }
            list.add(res);
        }
        return list;
    }
}
    
猜你喜欢
- 2024-10-24 0826-5.16.2-如何读取和分析Zookeeper Transaction Log 和Snapshots
 - 2024-10-24 揭秘!淘宝天猫海量图片元信息都存储在哪?
 - 2024-10-24 带你了解Android窗口机制Window、PhoneWindow和DecorView之间的关系
 - 2024-10-24 Zookeeper进阶学习(zookeeper详解)
 - 2024-10-24 分布式锁的多种实现方式详解(分布式锁的多种实现方式详解图)
 - 2024-10-24 Redis radix tree源码解析(redis源码解读)
 - 2024-10-24 ZooKeeper 相关概念以及使用小结(zookeeper的zab)
 - 2024-10-24 你不得不知的云计算与虚拟化基础知识(下)
 - 2024-10-24 很遗憾,没有一篇文章能讲清楚ZooKeeper
 - 2024-10-24 Vmware 虚拟机初始化(vmware虚拟机恢复初始)
 
欢迎 你 发表评论:
- 1588℃北京那些看上去很牛的车牌们!(北京厉害车牌)
 - 1107℃2025年度视频去水印软件TOP5对比:哪款最值得用
 - 683℃《我的世界》不同版本的差异 ——新手向
 - 595℃新疆话里的“虫子”
 - 515℃中兴光猫 Telnet下设置大全(中兴光猫命令大全)
 - 513℃蓝牙设备配对失败的系统性解决方案与技术解析
 - 507℃未备份电脑文件数据恢复的七种方法
 - 488℃工艺管道常用英文缩写 英汉对照
 
- 最近发表
 
- 标签列表
 - 
- jdk (81)
 - putty (66)
 - rufus (78)
 - 内网穿透 (89)
 - okhttp (70)
 - powertoys (74)
 - windowsterminal (81)
 - netcat (65)
 - ghostscript (65)
 - veracrypt (65)
 - asp.netcore (70)
 - wrk (67)
 - aspose.words (80)
 - itk (80)
 - ajaxfileupload.js (66)
 - sqlhelper (67)
 - express.js (67)
 - phpmailer (67)
 - xjar (70)
 - redisclient (78)
 - wakeonlan (66)
 - tinygo (85)
 - startbbs (72)
 - webftp (82)
 - vsvim (79)
 
 

本文暂时没有评论,来添加一个吧(●'◡'●)