概述
这道题,属于典型的树的遍历类问题;这道题适合使用BSF;
BSF的基本思路:
1.将初始对象加入队列, deque.offer(root)
2.只要deque不为空,需要遍历
- 获取deque的size为N
- 循环N次
- 将数据出对列,deque.poll();
- 将root.left和root.right 放到队列中
问题1: 给定二叉树, 请找到二叉树中最左下角的值
下面的树结构中,数字7是该树的最左下角的值,树结构如下:
针对这个问题,使用广度优先搜索,结果是展示每一层的第一个,使用队列,取出队列的第一个:
代码如下:
import org.example.TreeNode;
import java.util.Deque;
import java.util.LinkedList;
class Solution {
/**
* 12
* / \
* 9 10
* /|
* 7 4
* @param root
* @return
*/
public int findBottomLeftValue(TreeNode root) {
Deque<TreeNode> deque = new LinkedList<>();
deque.offer(root); // 1.将初始对象加入队列, deque.offer(root)
int value = root.val;
while (!deque.isEmpty()) { //2.只要deque不为空,需要遍历
int sz = deque.size(); //获取deque的size为N
for (int i = 0; i < sz; i++) { //循环N次
TreeNode node = deque.poll(); //将数据出对列,deque.poll();
if (i == 0) {
value = node.val;
}
if (node.left != null) {
deque.offer(node.left); //root.left 放到队列中
}
if (node.right != null) {
deque.offer(node.right); //root.right 放到队列中
}
}
}
return value;
}
}
问题2: 给定二叉树, 请找到二叉树中最右下角的值
下面的树结构中,数字4是该树的最右下角的值,树结构如下:
针对这个问题,使用广度优先搜索,结果是展示最后一个可以使用栈,取每一层出栈的第一个
代码如下:
/**
* 12
* / \
* 9 10
* /|
* 7 4
* @param root
* @return
*/
public int findBottomRightValue(TreeNode root) {
Deque<TreeNode> deque = new LinkedList<>();
deque.push(root);
int value = root.val;
while (!deque.isEmpty()) {
int sz = deque.size();
for (int i = 0; i < sz; i++) {
TreeNode node = deque.pop();
if (i == 0) {
value = node.val;
}
if (node.left != null) {
deque.push(node.left);
}
if (node.right != null) {
deque.push(node.right);
}
}
}
return value;
}
二叉树数据结构
package org.example;
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode() {
}
public TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}