leecode 513. 找树左下角的值
迭代:
/** * 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) { 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 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; } } 迭代法二: class Solution { public int findBottomLeftValue(TreeNode root) { if (root.left == null && root.right == null) { return root.val; } Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); TreeNode temp = new TreeNode(-100); while (!queue.isEmpty()) { temp = queue.poll(); //先加右节点,那么队列最后poll的就是最后一层的最左边的节点,更好理解。 if (temp.right != null) { // 先把右节点加入 queue queue.offer(temp.right); } if (temp.left != null) { // 再把左节点加入 queue queue.offer(temp.left); } } return temp.val; } }
递归:
class Solution { //记录最大深度和最大深度的最左边节点的最大值 int maxlen = -1; int maxval = 0; public int findBottomLeftValue(TreeNode root) { //初始是根节点的值为最大值 maxval = root.val; findLeftValue(root,0); return maxval; } private void findLeftValue(TreeNode root, int leftlen) { //结束条件:当前节点为空 if (root == null) return; //结束条件:当前节点左右节点都为空,则当前节点为叶子节点记录此时的最大值。 if (root.left == null && root.right == null) { if (leftlen > maxlen) { maxlen = leftlen; maxval = root.val; } } //这里用了回溯,具体还是不懂 if (root.left != null) findLeftValue(root.left,leftlen + 1); if (root.right != null) findLeftValue(root.right,leftlen + 1); } }