Lintcode 3715 · Lowest Common Ancestor V (最小祖先好题)

文章介绍了在给定二叉树和包含类TreeNode对象的数组中,如何使用中序遍历辅助函数找到所有节点的最低公共祖先(LCA)的算法。方法涉及使用unordered_set存储节点,递归地检查左右子树直到找到公共节点。

3715 · Lowest Common Ancestor VPRE
Algorithms
Medium

This topic is a pre-release topic. If you encounter any problems, please contact us via “Problem Correction”, and we will upgrade your account to VIP as a thank you.
Description
Given a binary tree with a root node root and an array nodes of objects of class TreeNode, you need to find the Lowest Common Ancestor (LCA, Lowest Common Ancestor) of all nodes in nodes and return it.

Where all the nodes in nodes exist in that binary tree and all the nodes in the binary tree have different values from each other.

Only $39.9 for the “Twitter Comment System Project Practice” within a limited time of 7 days!

WeChat Notes Twitter for more information(WeChat ID jiuzhang15)

The number of nodes in the tree is in the range
[
1
,
1
0
4
]
[1,10
4
]


1
0
9









.




1
0
9
−10
9
≤TreeNode.val≤10
9

All TreeNode.val are unique

All nodes[i] are unique

All nodes[i] exist in the tree

Example
Example 1

Input

root = {3,5,1,6,2,0,8,#,#,7,4}
nodes = [4,7]
Output

2
Explanation

The lowest common ancestor of TreeNode(4) and TreeNode(7) is TreeNode(2)
Example 2

Input

root = {3,5,1,6,2,0,8,#,#,7,4}
nodes = [2]
Output

2
Explanation

The lowest common ancestor of a single node is the node itself
Example 3

Input

root = {3,5,1,6,2,0,8,#,#,7,4}
nodes = [7,2,6,4]
Output

5
Explanation

The lowest common ancestor of TreeNode(7)、TreeNode(2)、TreeNode(6) and TreeNode(4) is TreeNode(5)
Example 4

Input

root = {3,5,1,6,2,0,8,#,#,7,4}
nodes = [0,2,3,1,5,8,6,4,7]
Output

3
Explanation

nodes contains all the nodes in the tree, and the lowest common ancestor of all the nodes in the tree is the root node
Tags
Related Problems

474
Lowest Common Ancestor II
Easy

578
Lowest Common Ancestor III
Medium

3715
Lowest Common Ancestor V
Medium

解法1:套用的labuladong的模板。

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param root: The root node of a binary tree.
     * @param nodes: An array of objects of class TreeNode.
     * @return: The lowest common ancestor of nodes.
     */
    TreeNode* lowestCommonAncestor(TreeNode *root, vector<TreeNode*> &nodes) {
        if (!root) return NULL;
        unordered_set<TreeNode *> nodeSet;
        for (auto pNode : nodes) nodeSet.insert(pNode);
        TreeNode *res = helper(root, nodeSet);
        return res;
    }
private:
    TreeNode* helper(TreeNode *root, unordered_set<TreeNode *> &nodeSet) {
        if (!root) return NULL;
        if (nodeSet.find(root) != nodeSet.end()) return root;
        TreeNode *left = NULL, *right = NULL;
        
        left = helper(root->left, nodeSet);
        right = helper(root->right, nodeSet);
        
        if (left && right) return root;
        return left ? left : right;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值