`

二叉树BFS变形题目总结

阅读更多
二叉树广度优先遍历我们采用队列来实现,这里列举三道leetcode中有关二叉树BFS的题目,总的思想是一样的,题目要求的输出不同,我们需要根据不同的要求来编写,考察我们对于二叉树搜索的基本思想掌握以及java基础的掌握。

1,Binary Tree Level Order Traversal
给定一颗二叉树,用广度优先搜索遍历所有节点,并输出结果。
例如:
    3
   / \
  9  20
    /  \
   15   7
输出:
[
  [3],
  [9,20],
  [15,7]
]

这是基本的二叉树水平遍历,我们只需要借助几个变量,来辅助记录什么时候应该记录结果,什么时候遍历下一层就可以了,代码如下:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> llist = new ArrayList<List<Integer>>();
        List<Integer> list = new ArrayList<Integer>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        int count = 0;
        int helper = 1;
        if(root == null) return llist;
        queue.offer(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if(helper > 0){
                list.add(node.val);
                helper --;
            }
            if(node.left != null) {
                queue.offer(node.left);
                count ++;
            }
            if(node.right != null) {
                queue.offer(node.right);
                count ++;
            }
            
            if(helper == 0) {
                llist.add(new ArrayList<Integer>(list));
                list.clear();
                helper = count;
                count = 0;
            }
        }
        return llist;
    }
}


2,Binary Tree Level Order Traversal II
给定一颗二叉树,用广度优先搜索遍历所有节点,并输出结果。
例如:
    3
   / \
  9  20
    /  \
   15   7
输出:
[
  [15,7],
  [9,20],
  [3]
]

第二道题与第一道题的输出结果不一样,是从最后一层开始的,这就考察我们对于Linkedlist的了解程度,我们用它的addFirst()方法可以轻松的将结果逆序,代码如下:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        LinkedList<List<Integer>> llist = new LinkedList<List<Integer>>();
        List<Integer> list = new ArrayList<Integer>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        if(root == null) return llist;
        queue.offer(root);
        int count = 0;
        int helper = 1;
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if(helper > 0) {
                list.add(node.val);
                helper --;
            }
            if(node.left != null) {
                queue.offer(node.left);
                count ++;
            }
            if(node.right != null) {
                queue.offer(node.right);
                count ++;
            }
            
            if(helper == 0) {
                llist.addFirst(new ArrayList<Integer>(list));
                list.clear();
                helper = count;
                count = 0;
            }
        }
        return llist;
    }
}


3,Binary Tree Zigzag Level Order Traversal
给定一颗二叉树,用广度优先搜索遍历所有节点,并输出结果。
例如:
    3
   / \
  9  20
    /  \
   15   7
输出:
[
  [3],
  [20,9],
  [15,7]
]

这道题要求我们以“Z”字形来输出结果,我们可以用一个标记来记录当然的层数,如果是奇数层我们就正序添加节点到结果集中,如果是偶数层我们就逆序添加节点到结果集中,同样采用addFirst()方法,代码如下:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        LinkedList<List<Integer>> llist = new LinkedList<List<Integer>>();
        LinkedList<Integer> list = new LinkedList<Integer>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        int flag = 1;
        int count = 0; 
        int helper = 1;
        if(root == null) return llist;
        queue.offer(root);
        while(!queue.isEmpty()) {
            TreeNode tem = queue.poll();
            if(helper > 0) {
                if(flag % 2 == 1) {
                    list.add(tem.val);
                } else {
                    list.addFirst(tem.val);
                }
                helper --;
            }
            if(tem.left != null) {
                queue.offer(tem.left);
                count ++;
            }
            if(tem.right != null) {
                queue.offer(tem.right);
                count ++;
            }
            if(helper == 0) {
                llist.add(new LinkedList<Integer>(list));
                helper = count;
                count = 0;
                flag ++;
                list.clear();
            }
        }
        return llist;
    }
}

分享到:
评论

相关推荐

    二叉树面试题目总结 全

    在二叉树中查找某个节点,判断节点是否存在,以及找到节点的最近公共祖先,都是面试中可能遇到的题目。最近公共祖先问题有两种解法,一种是递归,另一种是迭代。 二叉树中寻找和为特定值的所有路径是一个稍微复杂的...

    二叉树遍历BFS与DFS详细代码python版

    二叉树遍历BFS与DFS详细代码python版

    [数据结构与算法]JAVA二叉树题目总结(包含常见题目部分LeetCode题解)

    在IT领域,数据结构与算法是编程基础的重要组成部分,...总结,Java中的二叉树题目不仅要求对数据结构有深入理解,还需要灵活运用算法。不断练习和分析这些题目,能够帮助你提高编程技巧,增强在实际工作中的竞争力。

    面试题目集锦--二叉树

    面试的时候,我们会经常碰到二叉树之类的题目,这里,我对二叉树算法进行了许多的总结,希望能对一两位朋友有帮助

    树与二叉树算法总结

    树与二叉树算法总结 树与二叉树是计算机科学中非常重要的一部分,掌握树与二叉树的算法对于数据结构和算法设计非常重要。本文将对树与二叉树的基本概念、性质、运算和应用进行总结。 一、树的基本概念 树是一种非...

    二叉树大总结1_二叉树的各种题(遍历、查找)

    二叉树大总结1_二叉树的各种题(遍历、查找等),是网上一个不错的学习例子。

    二叉树面试题 树和二叉树总结.doc

    "二叉树面试题 树和二叉树总结" 本资源摘要信息涵盖了树和二叉树的面试题总结,包括选择题和解释。涵盖的知识点包括树和二叉树的定义、性质、操作和应用等。 一、树和二叉树的定义 树是一种数据结构,由一个根...

    二叉树的考研常见问题代码

    根据给定的信息,本文将对二叉树在考研中的常见问题进行详细解析,重点包括递归与非递归两种实现方式,并对特定知识点如节点数量统计、二叉树高度计算等进行深入探讨。 ### 一、二叉树的定义及基本操作 二叉树是一...

    二叉树的遍历实验报告.pdf

    总结,二叉树遍历是理解和操作二叉树的关键步骤,通过递归实现的先序、中序、后序遍历提供了灵活的访问和处理节点的方法。掌握这些遍历技巧对于解决复杂问题至关重要,特别是在实际编程应用中,如搜索算法、文件系统...

    二叉树题目列表1

    这些题目覆盖了二叉树的基本操作和特性,对于理解和掌握二叉树的性质以及递归算法的运用非常有帮助。在面试中,能够熟练地解决这些问题通常表明候选人对数据结构有深入的理解。在实际编程中,二叉树也被广泛应用,...

    二叉树的BFS和DFS

    给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。 示例 : 给定二叉树 1 / \ 2 3 / \ 4 5 返回 3, 它的长度是路径 [4,2...

    二叉树演示 实现二叉树图形显示

    一种常见的方法是使用层次遍历(广度优先搜索,BFS),通过队列来逐层处理节点,每层的节点水平排列,相邻层之间适当错开,以达到视觉上的层次效果。 二叉树的显示则通常依赖于图形库,例如Python中的`matplotlib`...

    二叉树遍历实验报告

    ### 二叉树遍历实验报告知识点概览 #### 一、实验背景及目标 **实验背景:** 本次实验属于《数据结构》课程的一部分,旨在通过实际编程加深学生对二叉树这一数据结构的理解和应用能力。二叉树作为一种基本且重要的...

    二叉树模拟器.py二叉树模拟器.py

    二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py...

    将满二叉树转化为求和二叉树_二叉树_

    总结来说,将满二叉树转化为求和二叉树的过程涉及到对二叉树遍历的理解,以及对树节点值的处理。通过先序遍历和中序遍历序列构建出满二叉树,然后计算每个节点的子树和,以创建新的求和二叉树。这个过程可以使用递归...

    数据结构二叉树镜像题目

    镜像对称的判断,主要是判断根节点的左右子树数据域是否相等,第二部分就是递归判断左子树的左子树与右子树的右子树以及右子树的左子树和左子树的右子树是否相等。

    根据后序二叉树序列构造二叉树_扩展二叉树

    在计算机科学领域,二叉树是...在实际应用中,这种方法可以应用于各种场景,例如数据结构的课程作业、编程竞赛题目或软件开发中的数据解析。通过深入理解二叉树的性质和后序遍历的规律,我们可以有效地解决类似的问题。

    题目整理(二叉树).pdf

    在本文件中,整理了与二叉树相关的多个考点,涵盖了建立二叉树、遍历二叉树、二叉树的深度和高度计算、二叉树的平衡判断、二叉树的修改操作等多个方面的算法知识。以下是整理的知识点: 1. 建立二叉树的二叉链表: ...

    二叉树课程设计的实验报告

    3 程序所能达到的功能:生成一个新的二叉树,实现对二叉树的先序,中序,后序和层次遍历,计算二叉树的深度,结点数,叶结点数,。 4 测式数据: A生成一个新的二叉树后,直接在键盘上按要求输入字符,可以依次输入...

    二叉树---数据结构

    二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树

Global site tag (gtag.js) - Google Analytics