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); }