需求:
给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
示例 1:
**输入: **root = [2,1,3]
**输出: **1
示例 2:
**输入: **[1,2,3,4,null,5,6,null,null,7]
**输出: **7
思路:
递归法:
这个题一上来给人的感觉是怎么确认遍历高度与最大深度,如果拿到最大深度就能取出叶子节点得到结果。这样逻辑就会比较复杂。
这里我们使用deep深度值与value值的全局变量,当我们得到叶子节点值进行复制,再次找打符合标准的叶子节点的值与上次深度进行对比,如果是一个深度不进行赋值如果本地大说明遍历到了更高深度的叶子节点,将值替换完成便利
层序法(广度搜搜)
这个题使用层序遍历更简单一些,一层一层的便利,知道最后一层更新value即可。
/**
* 513. 找树左下角的值
*/
public class FindBottomLeftValue513 {
// 找到最左边值的深度
int Deep = -1;
int result = 0;
public int findBottomLeftValue(TreeNode root) {
findLeftValue(root, 0);
return result;
}
//递归遍历
public void findLeftValue(TreeNode root, int deep) {
// deep 当前计算的树深度
if (root == null) return;
// 结束条件如果是叶子节点进行判断是否产生val
if (root.left == null && root.right == null) {
if (deep > Deep) {
result = root.val;
Deep = deep;
}
}
// 无中逻辑,所以前中后需都可以
if (root.left != null) {//左
deep++;
findLeftValue(root.left, deep);
deep--;
}
// //精简 代码 deep不参与深度计算,deep+1结果参与运算
// if(root.left !=null){
// findLeftValue(root.left, deep+1);
// }
if (root.right != null) {//右
deep++;
findLeftValue(root.right, deep);
deep--;
}
}
// 层序遍历(广度遍历)
public int findLeftValue(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
int res = 0;
if(root == null) return res;
queue.offer(root);
while (!queue.isEmpty()){
int size = queue.size();
for (int i = 0; i <size ; i++) {
TreeNode node = queue.poll();
if(i==0){
res = node.val;
}
if(node.left !=null) queue.offer(node.left);
if(node.right !=null) queue.offer(node.right);
}
}
return res;
}
}