leetcode513.找树左下角的值
1.题目描述:
给定一个二叉树的根节点root,请找出该二叉树的最底层最左边节点的值。假设二叉树中至少有一个节点。
2.BFS广度优先迭代:
记录每层的最左边节点(不一定是左叶子节点)的值,遍历过程中更新即可,代码很好写:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int findBottomLeftValue(TreeNode root) {
if(root == null) return 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int res = 0;
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode temp = queue.poll();
if (i == 0) res = temp.val;
if (temp.left != null) queue.add(temp.left);
if (temp.right != null) queue.add(temp.right);
}
}
return res;
}
}
3.DFS深度优先递归:
递归寻找到二叉树最底层最左边的节点,首先要找到最左边的节点可以采取前序遍历或者中序遍历,最底层则是找到二叉树的最大深度。遍历整颗二叉树递归中不需要有返回值,因此递归三步骤只剩下两步如下,①递归结束条件:root == null,直接return。②每级递归的操作:判断当前节点是否为叶子节点,若是叶子节点则继续判断该节点是否为最大深处,借助变量deep1来实现。最后递归左右子节点。
class Solution {
private int res = 0;
private int deep1 = -1;
public int findBottomLeftValue(TreeNode root) {
if (root == null) return 0;
dfs(root, 0);
return res;
}
public void dfs(TreeNode root, int deep) {
if (root == null) return;
if (root.left == null && root.right == null) {
if (deep > deep1) {
deep1 = deep;
res = root.val;
}
}
dfs(root.left, deep + 1);
dfs(root.right, deep + 1);
}
}
//中序遍历,左子节点先遍历
public void dfs(TreeNode root, int deep) {
if (root == null) return;
dfs(root.left, deep + 1);
if (root.left == null && root.right == null) {
if (deep > deep1) {
deep1 = deep;
res = root.val;
}
}
dfs(root.right, deep + 1);
}
