找树左下角的值
题目详细:LeetCode.513
由题可知:找出该二叉树的最底层、最左边节点的值
- 最底层:节点所处的深度最深
- 最左边:统一深度的节点,优先取最左边的节点
因此,我们只要找到满足这两个条件的节点就是树的左下角的节点,难点在于如何找?
- 找最底层:定义一个变量,用于记录遍历到的节点的深度,以此来确定当前节点是不是最底层的节点
- 找最左边:优先找最左边的节点,那么在访问子节点时,左节点要优先于右节点被访问,所以这道题可以使用多种不同的遍历方式,如前序、后序等等,只要保证左节点优先被访问就行。
这道题使用迭代的方式,比递归要清晰易懂些。
既然我们要找最底层、最左边的节点,那么层序遍历从上到下、从左到右的特点毫无疑问满足了我们所有的需求,只需要在遍历过程中,一直记录每一层最先访问的节点,那么当树遍历完时,返回记录的节点即是树左小角的值。
Java解法(迭代、层序遍历):
class Solution {
public int findBottomLeftValue(TreeNode root) {
return this.bfd(root);
}
public int bfd(TreeNode root){
Queue<TreeNode> queue = new LinkedList<>();
if(null != root) queue.offer(root);
int leftNum = 0;
while(!queue.isEmpty()){
int n = queue.size();
boolean f_switch = true;
while(n-- > 0){
TreeNode node = queue.poll();
// 每一层从左到右访问,所以每一层最先访问的节点就是最左边的节点
if(f_switch){
leftNum = node.val;
f_switch = false;
}
if(null != node.left) queue.offer(node.left);
if(null != node.right) queue.offer(node.right);
}
}
return leftNum;
}
}
也可以使用递归,不过我们需要改动一下代码:
- 在递归函数中增加一个深度参数,记录当前节点的深度,在遍历过程中比较节点的深度,保证节点位于最底层的特点
- 采用前序遍历(或后序遍历),使每一次递归都优先访问左节点,保证节点位于最左边的特点
- 优化:因为最底层的节点一定是叶子节点,所以我们可以在遍历到叶子节点时,再比较已遍历的最大深度和当前节点的深度,以此来判断该叶子节点是否为最底层的节点。
Java解法(递归,前序遍历):
class Solution {
public int maxDepth = 0;
public int ans = 0;
public int findBottomLeftValue(TreeNode root) {
this.dfs(root, 1);
return this.ans;
}
public void dfs(TreeNode root, int depth){
if(null == root) return;
if(null == root.left && null == root.right){
if(depth > this.maxDepth){
this.ans = root.val;
this.maxDepth = depth;
}
}
if(null != root.left) this.dfs(root.left, depth + 1);
if(null != root.right) this.dfs(root.right, depth + 1);
}
}
路径总和
题目详细:LeetCode.112
由题可知:只要求判断树中是否能够找到一条路径总和满足目标值的路径
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



