513. Find Bottom Left Tree Value
Given a binary tree, find the leftmost value in the last row of the tree.
Example 1:
Input: 2 / \ 1 3 Output: 1
Example 2:
Input: 1 / \ 2 3 / / \ 4 5 6 / 7 Output: 7
Note:You may assume the tree (i.e., the given root node)is not NULL.
中规中矩的层次遍历:
BFS
int ret = 0;
public int findBottomLeftValue(TreeNode root) {
if (root == null)
return ret;
bfs(root);
return ret;
}
private void bfs(TreeNode root) {
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
// 首先存储第一层的结点值
ret = root.val;
// 层次遍历,只需要记录本层结点个数即可
int curNum = 1;
// 下一层的节点数
int nextNum = 0;
while (!q.isEmpty()) {
TreeNode node = q.poll();
curNum--;
if (node.left != null) {
q.offer(node.left);
nextNum++;
}
if (node.right != null) {
q.offer(node.right);
nextNum++;
}
if (curNum == 0) {
// 当下一层不空的时候,第一个结点就是最左侧结点
if (!q.isEmpty())
ret = q.peek().val;
curNum = nextNum;
nextNum = 0;
}
}
}
以下来源discuss
改进版BFS
Doing BFS right-to-left means we can simply return the last node's value and don't have to keep track of the first node in the current row or even care about rows at all
从右往左BFS,最后一个结点的值即是结果。
public class Solution {
public int findBottomLeftValue(TreeNode root) {
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
while (!q.isEmpty()) {
root = q.poll();
if (root.right != null)
q.add(root.right);
if (root.left != null)
q.add(root.left);
}
return root.val;
}
}
递归版DFS
We will find the first node in the deepest level, no matter whether it's a left node or right node
public class Solution {
int ans = 0, pre = 0;
public int findBottomLeftValue(TreeNode root) {
findBottomLeftValue(root, 1);
return ans;
}
public void findBottomLeftValue(TreeNode root, int depth) {
// 如果左或右子树不空,那么pre会比depth小1,
// 当depth不在增长的时候即是最后一个最左侧结点
if (pre < depth) {
ans = root.val;
pre = depth;
}
if (root.left != null)
findBottomLeftValue(root.left, depth + 1);
if (root.right != null)
findBottomLeftValue(root.right, depth + 1);
}
}
//改进没有全局遍变量的解法
public class Solution {
public int findBottomLeftValue(TreeNode root) {
return findBottomLeftValue(root, 1, new int[] { 0, 0 });
}
public int findBottomLeftValue(TreeNode root,
int depth, int[] res) {
if (res[1] < depth) {
res[0] = root.val;
res[1] = depth;
}
if (root.left != null)
findBottomLeftValue(root.left, depth + 1, res);
if (root.right != null)
findBottomLeftValue(root.right, depth + 1, res);
return res[0];
}
}