leetcode513.找树左下角的值

1.题目描述:

给定一个二叉树的根节点root,请找出该二叉树的最底层最左边节点的值。假设二叉树中至少有一个节点。

leetcode513.找树左下角的值_第1张图片

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 queue = new LinkedList<>();
        queue.offer(root);
        int res = 0;
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {//这里使用while反而不方便
                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);
    }

你可能感兴趣的:(树,算法,数据结构,leetcode,java)