首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何编写在二叉树(java)中按级别顺序(从左到右)插入节点的方法?

在Java中,可以使用队列来实现按级别顺序(从左到右)插入节点的方法。具体步骤如下:

  1. 首先,定义一个二叉树节点类,包含节点值和左右子节点的引用。
代码语言:txt
复制
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode(int val) {
        this.val = val;
    }
}
  1. 创建一个队列,用于存储待插入节点的父节点。
代码语言:txt
复制
Queue<TreeNode> queue = new LinkedList<>();
  1. 如果二叉树为空,直接将新节点作为根节点。
代码语言:txt
复制
if (root == null) {
    root = new TreeNode(val);
    return root;
}
  1. 将根节点加入队列。
代码语言:txt
复制
queue.offer(root);
  1. 使用循环遍历队列,直到队列为空。
代码语言:txt
复制
while (!queue.isEmpty()) {
    TreeNode parent = queue.poll();

    // 尝试插入左子节点
    if (parent.left == null) {
        parent.left = new TreeNode(val);
        return root;
    } else {
        queue.offer(parent.left);
    }

    // 尝试插入右子节点
    if (parent.right == null) {
        parent.right = new TreeNode(val);
        return root;
    } else {
        queue.offer(parent.right);
    }
}

完整的代码如下:

代码语言:txt
复制
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode(int val) {
        this.val = val;
    }
}

public class BinaryTreeInsertion {
    public static TreeNode insertLevelOrder(TreeNode root, int val) {
        Queue<TreeNode> queue = new LinkedList<>();

        if (root == null) {
            root = new TreeNode(val);
            return root;
        }

        queue.offer(root);

        while (!queue.isEmpty()) {
            TreeNode parent = queue.poll();

            // 尝试插入左子节点
            if (parent.left == null) {
                parent.left = new TreeNode(val);
                return root;
            } else {
                queue.offer(parent.left);
            }

            // 尝试插入右子节点
            if (parent.right == null) {
                parent.right = new TreeNode(val);
                return root;
            } else {
                queue.offer(parent.right);
            }
        }

        return root;
    }

    public static void main(String[] args) {
        TreeNode root = null;
        root = insertLevelOrder(root, 1);
        root = insertLevelOrder(root, 2);
        root = insertLevelOrder(root, 3);
        root = insertLevelOrder(root, 4);
        root = insertLevelOrder(root, 5);
    }
}

这个方法可以确保按级别顺序(从左到右)插入节点,即先从根节点开始,逐层遍历二叉树,找到第一个空闲位置插入新节点。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

第二轮面试:手写Java二叉树

[Java知己] 阿里面试 --------- 现在很多公司在招聘开发岗位时候,都会事先在招聘信息中注明面试者应当具备知识技能,而且在面试过程,有部分对于技能掌握程度有严格要求公司还会要求面试者手写代码...有需要同学可以来在公众号【Java知己】,发送【面试】领取最新面试资料攻略! 让我们一起来实现二叉树 ---------- 现在,让我们看看可以在二叉树上执行最常见操作有哪些?...: public void add(int value) { root = addRecursive(root, value); } 现在让我们看看如何使用此方法从我们示例创建树: private...这种遍历也称为级别顺序,并从根开始,从左到右访问树所有级别。 对于实现,将我们使用 队列 顺序保存每个级别节点。...--- 在本文中,我们已经了解了如何Java实现已排序二叉树及其最常见操作。

1.6K11

如何学习算法:什么时完全二叉树?完全二叉树有什么特点?

高度为 h 完全二叉树是高度为h-1完美二叉树,并且在最后一层中元素从左到右顺序存储。...现在对于一个完整二叉树,它高度达到h-1,即;1、最后一层元素按照从左到右顺序存储。因此它也是一棵完全二叉树。这是存储在数组时元素表示形式 元素逐级存储在数组。...因此它不是完美的二叉树。 现在对于一个完整二叉树,它高度达到 h-1,即;1 和最后一级元素从左到右顺序存储。因此这是一个完全二叉树。...将元素存储在数组,它会像; 示例3: 二叉树高度为2,最多可以有7个节点,但只有5个节点,因此它不是完美的二叉树。 在完全二叉树情况下,我们看到在最后一层元素不是从左到右顺序填充。...利用这个概念,我们可以通过选择父节点来轻松插入节点和右节点。我们将插入数组存在第一个元素作为树第 0 层节点,并开始遍历数组,对于每个节点,我们将在树左侧和右侧插入节点

12310

数据结构07 二叉树

5、二叉树两种存储结构 5-1:顺序存储  对于完全二叉树而言,可以使用顺序存储结构。...但对于一般二叉树而言,使用顺序存储结构会有两个缺点:一、如果不是完全二叉树,则必须将其转化为完全二叉树;二、增加了很多虚节点,浪费资源空间。 ?...6、二叉树常见操作 6-1:插入节点 思路:首先找到要插入节点节点,然后确定插入到父节点左边还是右边,最后将节点插入。 6-2:查找节点 思路:运用递归查找。...,最后访问根节点 6-7:遍历之 层遍历 思路:从上到下,从左到右遍历节点 7、二叉树常见操作代码实现 代码如下: 节点类Node.java  public class Node { public...System.out.print(root.data + " "); } /** * 层遍历 * 思路:从上到下,从左到右遍历节点 *

78140

深入理解二叉树特点

完全二叉树:是指在二叉树里面除了最下面的2层节点之外,之上节点都必须有2个孩子节点,最底层叶子节点没有孩子,在倒数第二层节点可以拥有0,1,2个孩子节点,此外,最底层级别节点添加必须从左到右,不能跳跃...满二叉树 VS 完全二叉树 (一) 不是每一个满二叉树都是完全二叉树 (1) 满二叉树叶子节点可以出现在任何级别,完全二叉树只能出现最底层两个级别。...(2) 满二叉树最底层级别的添加,不需要从左到右 (二)不是每一个完全二叉树都是一个满二叉树 (1)完全二叉树节点可以拥有0,1,2 个孩子节点,而满二叉树只能是0或者2个。...,然后左孩子和右孩子) (2)序遍历 (先左孩子,然后父节点和右孩子) (3)后序遍历 (先左孩子,然后右孩子和父节点) (二) 广度优先遍历 广度优先遍历仅仅只有一种策略层级顺序遍历,遍历顺序是从顶到底...最后在广度优先层级遍历,这个其实最容易理解,就是沿着从上到下,从左到右顺序连线即可。

2K20

前端工程师leetcode算法面试必备-二叉树深度广度遍历1

接下来,通过具体题目解析,带大家了解 DFS 和 BFS 搜索思想在二叉树应用。二、102. 二叉树层次遍历给定一个二叉树,返回其层次遍历节点值。(即逐层地,从左到右访问所有节点)。...图片2、DFS  采用 DFS 搜索思想,需要注意在递归过程记录当前节点层次信息:图片三、145. 二叉树后序遍历给定一个二叉树,返回它 后序 遍历。  ...,再后序遍历右子树,最后访问根;以本道题后序遍历为例,尝试递归和迭代两种不同方法:1、递归实现 DFS  从定义,大家应该能够想象到递归代码如何书写:图片参考视频:传送门2、迭代实现 DFS  ...把一条垂线从 X = -infinity 移动到 X = +infinity ,每当该垂线与结点接触时,我们从上到下顺序报告结点值( Y 坐标递减)。...如果两个结点位置相同,则首先报告结点值较小。 X 坐标顺序返回非空报告列表。每个报告都有一个结点值列表。  最后,通过本道题目来开启 Medium 难度题型讲解。

40620

前端工程师leetcode算法面试必备-二叉树深度广度遍历

接下来,通过具体题目解析,带大家了解 DFS 和 BFS 搜索思想在二叉树应用。 二、102. 二叉树层次遍历 给定一个二叉树,返回其层次遍历节点值。(即逐层地,从左到右访问所有节点)。...这里需要利用队列(queue)来保存每一层需要访问节点,需要特别注意队列特性是先进先出,而本题要求每一层从左到右遍历,所以需要先将左子树放入队列。...,再后序遍历右子树,最后访问根; 以本道题后序遍历为例,尝试递归和迭代两种不同方法: 1、递归实现 DFS   从定义,大家应该能够想象到递归代码如何书写: 图片 2、迭代实现 DFS   本道题目采用迭代实现...把一条垂线从 X = -infinity 移动到 X = +infinity ,每当该垂线与结点接触时,我们从上到下顺序报告结点值( Y 坐标递减)。...如果两个结点位置相同,则首先报告结点值较小。 X 坐标顺序返回非空报告列表。每个报告都有一个结点值列表。   最后,通过本道题目来开启 Medium 难度题型讲解。

35520

前端工程师leetcode算法面试之二叉树深度广度遍历

接下来,通过具体题目解析,带大家了解 DFS 和 BFS 搜索思想在二叉树应用。二、102. 二叉树层次遍历给定一个二叉树,返回其层次遍历节点值。(即逐层地,从左到右访问所有节点)。...图片2、DFS  采用 DFS 搜索思想,需要注意在递归过程记录当前节点层次信息:图片三、145. 二叉树后序遍历给定一个二叉树,返回它 后序 遍历。  ...,再后序遍历右子树,最后访问根;以本道题后序遍历为例,尝试递归和迭代两种不同方法:1、递归实现 DFS  从定义,大家应该能够想象到递归代码如何书写:图片参考视频:传送门2、迭代实现 DFS  ...把一条垂线从 X = -infinity 移动到 X = +infinity ,每当该垂线与结点接触时,我们从上到下顺序报告结点值( Y 坐标递减)。...如果两个结点位置相同,则首先报告结点值较小。 X 坐标顺序返回非空报告列表。每个报告都有一个结点值列表。  最后,通过本道题目来开启 Medium 难度题型讲解。

30140

简单聊聊红黑树(Red Black Tree)

,所以在这里想写一篇文章简单和大家聊聊下红黑树 小看过很多讲红黑树文章,都不是很容易懂,主要也是因为完整红黑树很复杂,想通过一篇文章来说清楚实在很难,所以在这篇文章我想尽量用通俗口语化语言,再结合...可以参考下图 二叉树最好/最坏情况: 上图可以看到,二叉树性能好坏,依赖数据插入顺序,最坏情况下二叉树会退化为链表,所有操作时间复杂度回到线性级别 O(n),那么怎么解决这个问题呢?...红黑树可以保证 所有操作时间复杂度都是对数级别 O(logN) 和二叉树不同,无论插入顺序如何,红黑树都是接近完美平衡 无数实验应用证明,红黑树操作成本比二叉树降低40%左右 常见树形结构操作复杂度对比...,下面罗列三种情况: 插入最大键 插入最小键 插入中间键 我们可以发现,无论插入数据如何不同,通过旋转,变色操作后最终得到结果都是相同,树永远保持平衡,具体可以看下方示意图: 有了上面的理解,...,进行左旋转,M成为R左红子节点(这里违反2个规则) X首先插入到S右边,S违反了不能出现红右子节点规则,进行左旋转,S成为X左红子节点 通过以上证明,就可以得出结论,和二叉树不同,无论数据插入顺序如何

64210

一文带你深入理解Mysql索引底层数据结构与算法

理解索引特性 索引是帮助Mysql高效获取数据排好序数据结构 索引是存储在文件里面的 索引各种存储结构及优缺点 首先看一下,在数据库没有加索引情况下,SQLwhere语句是如何查找目标记录...二叉树 二叉树特点 至少有一个节点(根节点) 每个节点最多有两颗子树,即每个节点度小于3。 左子树和右子树是有顺序,次序不能任意颠倒。...如果不手动指定主键,InnoDB会从插入数据找出不重复一列作为主键索引,如果没找到不重复一列,这时候InnoDB会选择内置ROWID作为主键,写入顺序和ROWID增长顺序一致;其次,索引数据类型是整型...定义联合索引(员工级别,员工姓名,员工出生年月),将联合索引按照索引顺序放入节点中,新插入节点时,先按照联合索引员工级别比较,如果相同会按照是员工姓名比较,如果员工级别和员工姓名都相同 最后是员工出生年月比较...可以从图中从上到下,从左到右看,第一个B+树节点 是通过联合索引员工级别比较,第二个节点是 员工级别相同,会按照员工姓名比较,第三个节点是 员工级别和员工姓名都相同,会按照员工出生年月比较。

65110

LeetCode-面试题32-3-从上到下打印二叉树

# LeetCode-面试题32-3-从上到下打印二叉树 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右顺序打印,第二层按照从右到左顺序打印,第三行再按照从左到右顺序打印,其他行以此类推...] ] 提示: 节点总数 <= 1000 # 解题思路 递推:奇数行从左到右打印,偶数行从右到左打印 用一个队列Queue保存节点,并利用一个双端队列保存行数据,如下: 将root节点放入queue 重复以下...2个步骤,直到queue为空为止: 新建一个双端队列,存储行数据 当queue.size()>0时开始循环: ​ 取出queue头结点,添加进rowList ​ 判断当前行是奇数行还是偶数行...,由于数组是从0开始存储,所以原本奇数变成了偶数,偶数变成了奇 ​ 数,对于0行和2行,应该从左到右输出,所以向尾部插入新数据即可;对于1行,应该从右到左输出,所以 ​ 向头部插入新数据即可倒序...​ 找出头结点左右子节点,依次放入queue 添加rowList进入result数组 # Java代码 /** * Definition for a binary tree node

21720

【算法题解】 Day22 搜索与回溯

从上到下打印二叉树 题目 剑指 Offer 32 - I. 从上到下打印二叉树 难度:medium 从上到下打印出二叉树每个节点,同一层节点按照从左到右顺序打印。...<= 1000 方法一:BFS 思路 根据题意,这是二叉树广度优先搜索(BFS)。...从上到下打印二叉树 II 题目 剑指 Offer 32 - II. 从上到下打印二叉树 II 难度:easy 从上到下层打印二叉树,同一层节点从左到右顺序打印,每一层打印到一行。...从上到下打印二叉树 III 难度:medium 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右顺序打印,第二层按照从右到左顺序打印,第三行再按照从左到右顺序打印,其他行以此类推。...], [15,7] ] 提示: 节点总数 <= 1000 方法一:BFS 思路 跟之前题目还是大相庭径,这题的话,打印顺序交替变化,因此可以考虑双端队列;   解题 Python: class

15730

数据结构笔记(二)

二叉树特定 每个节点最多有两棵子树,所以二叉树不存在度大于2节点。 左子树和右子树是有顺序,次序不能任意颠倒。 即使树种某节点只有一棵子树,也有区分它是左子树还是右子树。...满二叉树 在一棵二叉树,如果所有分支节点都存在左子树和右子树,并且所有叶子都在同一层上,这样二叉树称为满二叉树。...二叉树存储结构 二叉树顺序存储结构 二叉树顺序存储结构就是用一维数组存储二叉树结点,并且结点存储位置,也就是数组下标要能体现结点之间逻辑关系,比如双亲与孩子关系,左右兄弟关系等。...二叉树遍历方法 前序遍历 规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。...层序遍历 规则是若树为空,则空操作返回,否则从树第一层,也就是根结点开始访问,从上而下逐层遍历,在同一层从左到右顺序对结点逐个访问。

28330

前端学习数据结构与算法系列(四):哈希、堆和二叉查找树

优先队列是一种数据结构,可以自由添加数据,但取出数据时要从最小值开始顺序取出。在堆树形结构,各个顶点被称为“结点(node)”,数据就存储在这些节点中。...堆特点 如下图所示,每个节点由两个子节点,用线条连接即为堆: 结点内数字就是存储数据 堆每个结点最多有两个子节点形状取决于数据个数 节点排列顺序为从上到下,同一行里则为从左到右节点必须小于子结点...例如,将数字5添加到堆: 结点6有个空位置,将数字5加在结点6 数字5结点父结点大于本身,故调换位置 交换完毕后数字5结点节点小于本身,所以不再交换,往堆插入数据5操作结束 堆数据获取...与示例1步骤一样,与二叉树顶端结点进行比较,由于4<15,数据左移 将插入结点与15子结点9进行比价,4<9,数据左移 将插入结点与9子结点3进行比较,4>3,数据右移 将插入结点与3子结点...,数据左移 左移后,将要查询结点12与结点15子结点4进行比较,5<12,数据右移 右移后,找到结点12,查询结束 写在最后 * 文中使用图片源自《我第一本算法书》,如若侵权,请联系图雀社区公众号小

52010

【算法题解】 Day6 BFS | DFS

n 叉树 在输入层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。...二叉树层序遍历 题目 102. 二叉树层序遍历 难度:medium 给你二叉树节点 root ,返回其节点 层序遍历 。 (即逐层地,从左到右访问所有节点)。...在上述过程第 i 次迭代就得到了二叉树第 i 层 si 个元素。 为什么这么做是对呢?... 时性质成立,即第 k 轮中出队 sk 元素是第 k 层所有元素,并且顺序从左到右。...我们开下脑洞,把这个二叉树样子调整一下,摆成一个田字形样子。田字形每一层就对应一个 list。 按照深度优先处理顺序,会先访问节点 1,再访问节点 2,接着是节点 3。

19230

【愚公系列】软考中级-软件设计师 017-数据结构(树和二叉树概念)

结构使得在树中进行快速搜索、插入、删除操作成为可能。 树节点有一个或多个子节点,每个子节点又可以有自己节点,形成了一个递归结构。...1.3 完全二叉树和满二叉树 完全二叉树是一种特殊二叉树,除了最后一层外,每一层节点都是从左到右连续排列,最后一层节点从左到右填充。...1.4 二叉树存储结构 二叉树存储结构有三种常见形式: 1、顺序存储:就是用一组连续存储单元存储二叉树节点,按照从上到下,从左到右顺序依次存储每个节点。...每个二叉链表节点存储一个二叉树节点,头指针则指向根节点。 1.5 二叉树遍历 二叉树遍历是指按照某种顺序访问二叉树所有节点。常用二叉树遍历方式有三种:前序遍历、序遍历和后序遍历。...此外,还有两种特殊遍历方式:层序遍历和逆序遍历。 层序遍历(level order traversal):层级从上到下、从左到右顺序遍历二叉树

20521

算法——二叉树

特点: 每个结点最多有两棵子树,所以二叉树不存在度大于2结点。注意不是只有两棵子树,而是最多有。没有子树或者有一棵子树都是可以。 左子树和右子树是有顺序,次序不能任意颠倒。...满二叉树:在一棵二叉树,如果所有分支节点都存在左子树和右子树,并且所有叶子都在同一层,这样二叉树称为满二叉树 完全二叉树:对一棵具有n个结点二叉树层序编号,如果编号为i (1<=i<=n)结点与同样深度二叉树编号为...二叉树遍历方法: 前序遍历:规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。如图所示,遍历顺序为:ABDGHCEIF。...后序遍历:规则是若树为空,则空操作返回,否则从左到右先叶子后结点方式遍历访向左右子树,最后是访问根结点。如图所示,遍历顺序为:GHDBIEFCA。...层序遍历:规则是若树为空,则空操作返回,否则从树第一层, 也就是根结点开始访问,从上而下逐层遍历,在同一层从左到右顺序对结点逐个访问。如图所示,遍历顺序为:ABCDEFGHI。

26830

数据结构——二叉树

特点: 每个结点最多有两棵子树,所以二叉树不存在度大于2结点。注意不是只有两棵子树,而是最多有。没有子树或者有一棵子树都是可以。 左子树和右子树是有顺序,次序不能任意颠倒。...满二叉树:在一棵二叉树,如果所有分支节点都存在左子树和右子树,并且所有叶子都在同一层,这样二叉树称为满二叉树 完全二叉树:对一棵具有n个结点二叉树层序编号,如果编号为i (1<=i<=n)结点与同样深度二叉树编号为...二叉树遍历方法: 前序遍历:规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。如图所示,遍历顺序为:ABDGHCEIF。 ?...后序遍历:规则是若树为空,则空操作返回,否则从左到右先叶子后结点方式遍历访向左右子树,最后是访问根结点。如图所示,遍历顺序为:GHDBIEFCA。 ?...层序遍历:规则是若树为空,则空操作返回,否则从树第一层, 也就是根结点开始访问,从上而下逐层遍历,在同一层从左到右顺序对结点逐个访问。如图所示,遍历顺序为:ABCDEFGHI。 ?

38220

7-1 树结构 和 二叉树

兄弟:具有同一父节点 一群节点; ⑧节点层次: 根节点为1,其它节点层次等于它节点+1; ⑨树深度:节点最大层次值; ⑩有序树 和 无序树: 如果某棵树节点都是从左到右顺序排列,交换两个节点位置会产生一个不同树...因此,如果我们想顺序存储普通二叉树,需要提前将普通二叉树转化为完全二叉树方法很简单,人为添加一些并不存在节点(其元素值为“空”),使之成为一颗完全二叉树形式。...完全二叉树顺序存储,仅需从根节点开始,按照层次依次将树节点存储到数组即可。 从顺序还原完全二叉树也很简单。...D L R顺序,且下层子树也是这个D L R 顺序二叉树 先序遍历就是 a-b-d-e-c-f-g ?...(BT->R);//访问该结点右孩子 } return; } ②序遍历 ,是根节点居中, L D R ,且下层子树也是这个L D R顺序 ?

57430

第36期:二叉树遍历(小白必看)

在上一节,我们通过例题学习了二叉树最大深度与DFS,其实就是沿着一个方向一直向下遍历。那我们可不可以按照高度一层一层访问树数据呢?...当然可以,就是本节我们要讲BFS(宽度优先搜索),同时也被称为广度优先搜索。 我们仍然通过例题进行讲解。 01、题目分析 第102题:二叉树层次遍历 给定一个二叉树,返回其层次遍历节点值。...(即逐层地,从左到右访问所有节点)。...我们可以对该二叉树进行先序遍历(根左右顺序),同时,记录节点所在层次level,并且对每一层都定义一个数组,然后将访问到节点值放入对应层数组。...那我们能不能直接使用BFS方式进行解题呢?当然,我们可以使用Queue数据结构。我们将root节点初始化进队列,通过消耗尾部,插入头部方式来完成BFS。 具体步骤如下图: ?

39230

BAT大厂都会问MySQL底层数据结构

索引是帮助MySQL高效获取数据排好序数据结构 索引数据结构对比 二叉树 左边子节点数据小于父节点数据,右边子节点数据大于父节点数据。...B树 本质是多路二叉树;叶节点具有相同深度,叶节点指针为空;所有索引元素不重复;节点中数据索引从左到右依次递增; ?...如果不手动指定主键,InnoDB会从插入数据找出不重复一列作为主键索引,如果没找到不重复一列,InnoDB会在后台增加一列rowId做为主键索引。...定义联合索引(员工级别,员工姓名,员工出生年月),将联合索引按照索引顺序放入节点中,新插入节点时,先按照联合索引员工级别比较,如果相同会按照是员工姓名比较,如果员工级别和员工姓名都相同 最后是员工出生年月比较...可以从图中从上到下,从左到右看,第一个B+树节点 是通过联合索引员工级别比较,第二个节点是 员工级别相同,会按照员工姓名比较,第三个节点是 员工级别和员工姓名都相同,会按照员工出生年月比较。

4.2K51
领券