LeetCode - Medium - 1123

Description


https://leetcode.com/problems/lowest-common-ancestor-of-deepest-leaves/

Given the root of a binary tree, return the lowest common ancestor of its deepest leaves.

Recall that:

  • The node of a binary tree is a leaf if and only if it has no children

  • The depth of the root of the tree is 0. if the depth of a node is d, the depth of each of its children is d + 1.

  • The lowest common ancestor of a set S of nodes, is the node A with the largest depth such that every node in S is in the subtree with root A.

Note: This question is the same as 865: https://leetcode.com/problems/smallest-subtree-with-all-the-deepest-nodes/

Example 1:

在这里插入图片描述

Input: root = [3,5,1,6,2,0,8,null,null,7,4]

Output: [2,7,4]

Explanation: We return the node with value 2, colored in yellow in the diagram.

The nodes coloured in blue are the deepest leaf-nodes of the tree.

Note that nodes 6, 0, and 8 are also leaf nodes, but the depth of them is 2, but the depth of nodes 7 and 4 is 3.

Example 2:

Input: root = [1]

Output: [1]

Explanation: The root is the deepest node in the tree, and it’s the lca of itself.

Example 3:

Input: root = [0,1,3,null,2]

Output: [2]

Explanation: The deepest leaf node in the tree is 2, the lca of one node is itself.

Constraints:

  • The number of nodes in the tree will be in the range [ 1 , 1000 ] [1, 1000] [1,1000].

  • 0 < = N o d e . v a l < = 1000 0 <= Node.val <= 1000 0<=Node.val<=1000

  • The values of the nodes in the tree are unique.

Analysis


LeetCode - Medium - 236. Lowest Common Ancestor of a Binary Tree启发。

方法一:自己写的,用后序遍历模式

方法二:别人写的,用后序遍历模式

Submission


import com.lun.util.BinaryTree.TreeNode;

public class LowestCommonAncestorOfDeepestLeaves {

//方法一:自己写的,用后序遍历模式

public TreeNode lcaDeepestLeaves(TreeNode root) {

Object[] result = lcaDeepestLeaves(root, 0);

return result != null ? (TreeNode)result[0] : null;

}

private Object[] lcaDeepestLeaves(TreeNode node, int depth) {

if(node == null) return null;

depth++;

Object[] leftResult = lcaDeepestLeaves(node.left, depth);

Object[] rightResult = lcaDeepestLeaves(node.right, depth);

if(leftResult == null && rightResult == null) {//叶子节点

return new Object[] {node, depth};

}else if(leftResult != null && rightResult == null){

return leftResult;

}else if(leftResult == null && rightResult != null) {

return rightResult;

}else {

int leftDepth = (int)leftResult[1];

int rightDepth = (int)rightResult[1];

if(leftDepth > rightDepth) {

return leftResult;

}else if(leftDepth < rightDepth) {

return rightResult;

}else {

leftResult[0] = node;

return leftResult;

}

}

}

//方法二:别人写的,用后序遍历模式

public TreeNode lcaDeepestLeaves2(TreeNode root) {

Pair p = getLca(root, 0);

return p.node;

}

private Pair getLca(TreeNode root, int d) {

if (root == null) return new Pair(null, d);

Pair l = getLca(root.left, d + 1);

Pair r = getLca(root.right, d + 1);

if (l.d == r.d) {

return new Pair(root, l.d);

} else {

return l.d > r.d ? l : r;

}

}

private class Pair {

TreeNode node;

int d;

Pair(TreeNode node, int d) {

this.node = node;

this.d = d;

}

}

最后

分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。

这些面试题相对应的技术点:

  • JVM
  • MySQL
  • Mybatis
  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

[外链图片转存中…(img-rALjdppc-1718902274431)]

[外链图片转存中…(img-BhtRqIiX-1718902274432)]

[外链图片转存中…(img-3iF0novm-1718902274432)]

[外链图片转存中…(img-flDLnE8h-1718902274433)]

[外链图片转存中…(img-RKtGg8CV-1718902274434)]

[外链图片转存中…(img-BSEpiEMS-1718902274434)]

[外链图片转存中…(img-WZIP8a5a-1718902274435)]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值