1123.最深叶节点的最近公共祖先
链接:1123.最深叶节点的最近公共祖先
难度:Medium
标签:树、深度优先搜索、广度优先搜索、哈希表、二叉树
简介:给你一个有根节点 root 的二叉树,返回它 最深的叶节点的最近公共祖先 。
题解 1 - rust
- 编辑时间:2023-09-06
- 内存消耗:2.05MB
- 编程语言:rust
- 解法介绍:同上。
use std::cell::RefCell;
use std::rc::Rc;
impl Solution {
    pub fn lca_deepest_leaves(
        root: Option<Rc<RefCell<TreeNode>>>,
    ) -> Option<Rc<RefCell<TreeNode>>> {
        fn dfs(node: Rc<RefCell<TreeNode>>, level: usize) -> (usize, Rc<RefCell<TreeNode>>) {
            let mut res = (level, node.clone());
            let node_ref = node.as_ref().borrow();
            if let Some(ref left) = node_ref.left {
                res = dfs(left.clone(), level + 1);
            }
            if let Some(ref right) = node_ref.right {
                let rres = dfs(right.clone(), level + 1);
                if rres.0 > res.0 {
                    res = rres;
                } else if rres.0 == res.0 {
                    res.1 = node.clone();
                }
            }
            res
        }
        Some(dfs(root.unwrap().clone(), 0).1)
    }
}
题解 2 - python
- 编辑时间:2023-09-06
- 执行用时:52ms
- 内存消耗:16.27MB
- 编程语言:python
- 解法介绍:bfs。
class Solution:
    def lcaDeepestLeaves(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        prevq = []
        q: deque[TreeNode] = deque()
        q.append(root)
        size = 1
        m: dict[TreeNode, TreeNode] = {}
        while len(q):
            cur = q.popleft()
            prevq.append(cur)
            if cur.left:
                m[cur.left] = cur
                q.append(cur.left)
            if cur.right:
                m[cur.right] = cur
                q.append(cur.right)
            size -= 1
            if size == 0:
                size = len(q)
                if size:
                    prevq.clear()
        while len(set(prevq)) > 1:
            prevq = [m[item] for item in prevq]
        return list(set(prevq))[0]
题解 3 - cpp
- 编辑时间:2023-09-06
- 执行用时:8ms
- 内存消耗:20.18MB
- 编程语言:cpp
- 解法介绍:dfs。
class Solution {
public:
    TreeNode* lcaDeepestLeaves(TreeNode* root) {
        function<pair<int, TreeNode*>(TreeNode*, int)> dfs = [&](TreeNode *node, int level) -> pair<int, TreeNode*> {
            pair<int, TreeNode*> res = make_pair(level, node);
            if (node->left) {
                res = dfs(node->left, level + 1);
            }
            if (node->right) {
                auto rres = dfs(node->right, level + 1);
                if (rres.first > res.first) res = rres;
                else if (rres.first == res.first) res.second = node;
            }
            return res;
        };
        return dfs(root, 0).second;
    }
};
题解 4 - python
- 编辑时间:2023-09-06
- 执行用时:52ms
- 内存消耗:16.27MB
- 编程语言:python
- 解法介绍:同上。
class Solution:
    def lcaDeepestLeaves(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        def dfs(node: TreeNode, level: int) -> (int, TreeNode):
            res = (level, node)
            if node.left:
                res = dfs(node.left, level + 1)
            if node.right:
                right_result = dfs(node.right, level + 1)
                if right_result[0] > res[0]:
                    res = right_result
                elif right_result[0] == res[0]:
                    res = (res[0], node)
            return res
        return dfs(root, 0)[1]