携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第35天,点击查看活动详情 >>
迭代法求解二叉树最底层最左边的结点值
前面我们已经介绍了用递归的方法如何去求解二叉树最底层最左边的结点值,如果已经忘记了的朋友可以先去看看:递归法求二叉树最底层最左边的结点值 - 掘金 (juejin.cn)
(里面有详细的问题背景介绍,如果已经忘记的朋友记得先去复习一下,再来学习这种新方法哟)
可能之前对于递归的方法有点难理解,那么今天咱们就再来学习一种新的方法,今天的这种方法是和这道题的背景很贴切的,相信各位一看就懂。
那么话不多说,咱们直接开始学习今天的主题内容——如何用迭代法去求解二叉树最底层最左边的结点值。
算法分析
这次使用的是迭代法来求解,在这过程中,我们主要是使用了二叉树的层次遍历。层次遍历就是对二叉树进行一层一层地访问(注意在同一层中的访问是从左到右的,也就是说首次访问当前层的结点就是该层中最左边的结点,只要不断迭代到最底层就可以求得二叉树最底层最左边的结点值。
算法的代码具体实现:
class Solution {
public int findBottomLeftValue(TreeNode root) {
if (root == null) {
return 0;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int leftValue = 0;
while (!queue.isEmpty()) {
int size = queue.size();
int tmp = size;
while (size > 0) {
TreeNode poll = queue.poll();
if (poll != null) {
if (tmp == size) {
leftValue = poll.val;
}
if (poll.left != null) {
queue.add(poll.left);
}
if (poll.right != null) {
queue.add(poll.right);
}
}
size--;
}
}
return leftValue;
}
}
这种层次遍历是借助了队列数据结构来实现的,通过不断地将当前层结点加入队列中,再依次出队访问。
算法的核心代码:
while (!queue.isEmpty()) {
int size = queue.size();
int tmp = size;
while (size > 0) {
TreeNode poll = queue.poll();
if (poll != null) {
if (tmp == size) {
leftValue = poll.val;
}
if (poll.left != null) {
queue.add(poll.left);
}
if (poll.right != null) {
queue.add(poll.right);
}
}
size--;
}
size 和 tmp 两个变量都是记录着当前层的结点数的,但是size变量的值会随着结点的不断出队而减少,可能tmp始终记录的都是当前层的结点数,所以当tmp 等于 size时所访问的结点就是当前层最左边的结点。
总结:
本次我们介绍了如何用迭代法去求解二叉树的最底层的最左边的结点的值,这种方法是一层一层处理的(广度优先遍历)。就相比于之前的递归方法(深度优先比遍历)更容易被人接受。