1143. Lowest Common Ancestor (30)

本文介绍了一种高效算法来解决二叉搜索树中两个节点的最低公共祖先(LCA)问题。通过预处理二叉搜索树的前序遍历序列,并结合中序遍历的性质,快速定位LCA。此外,还提供了完整的代码实现和样例输入输出。

1143. Lowest Common Ancestor (30)
时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B
判题程序 Standard 作者 CHEN, Yue

The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U and V as descendants.
A binary search tree (BST) is recursively defined as a binary tree which has the following properties:
The left subtree of a node contains only nodes with keys less than the node’s key.
The right subtree of a node contains only nodes with keys greater than or equal to the node’s key.
Both the left and right subtrees must also be binary search trees.
Given any two nodes in a BST, you are supposed to find their LCA.
Input Specification:
Each input file contains one test case. For each case, the first line gives two positive integers: M (<= 1000), the number of pairs of nodes to be tested; and N (<= 10000), the number of keys in the BST, respectively. In the second line, N distinct integers are given as the preorder traversal sequence of the BST. Then M lines follow, each contains a pair of integer keys U and V. All the keys are in the range of int.
Output Specification:
For each given pair of U and V, print in a line “LCA of U and V is A.” if the LCA is found and A is the key. But if A is one of U and V, print “X is an ancestor of Y.” where X is A and Y is the other node. If U or V is not found in the BST, print in a line “ERROR: U is not found.” or “ERROR: V is not found.” or “ERROR: U and V are not found.”.
Sample Input:
6 8
6 3 1 2 5 4 8 7
2 5
8 7
1 9
12 -3
0 8
99 99
Sample Output:
LCA of 2 and 5 is 3.
8 is an ancestor of 7.
ERROR: 9 is not found.
ERROR: 12 and -3 are not found.
ERROR: 0 is not found.
ERROR: 99 and 99 are not found.

注意点:不能直接进行插入建树,会超时…

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <stack>
#include <set>
using namespace std;
const int Maxn = 10000;

typedef struct node {
    int data;
    struct node* lchild;
    struct node* rchild;
    node() { lchild = rchild = nullptr; }
}TNode, *PTNode;


int M, N;
set<int> keys;
int pre[Maxn], in[Maxn];

//void Insert(PTNode  & root, int data) {
//  if (!root) {
//      root = new TNode;
//      root->data = data;
//      return;
//  }
//  else if (root->data < data) Insert(root->rchild, data);
//  else if (root->data > data) Insert(root->lchild, data);
//}

PTNode CreateBST(int pre[], int in[], int p_l, int p_r, int i_l, int i_r) {
    if (p_l > p_r) return nullptr;
    PTNode root = new TNode;
    root->data = pre[p_l];

    int idx = i_l;
    while (idx < i_r && in[idx] != pre[p_l])++idx;
    root->lchild = CreateBST(pre, in, p_l + 1, p_l + idx - i_l - 1, i_l, idx - 1);
    root->rchild = CreateBST(pre, in, p_l + idx - i_l + 1, p_r, idx + 1, i_r);
    return root;
}


int findLCA(PTNode root, int e1, int e2, bool &ans1, bool &ans2) {
    if (e1 < root->data && e2 < root->data)  return findLCA(root->lchild, e1, e2, ans1, ans2);//如果当前根节点均小于查询的两个节点,则最小近公共祖先在左子树
    else if (e1 > root->data && e2 > root->data)  return findLCA(root->rchild, e1, e2, ans1, ans2);//如果当前根节点均大于查询的两个节点,则最小近公共祖先在右子树
    else if (e1 > root->data && e2 < root->data || e1 < root->data && e2 > root->data) return root->data;//如果一大一小,那么当前节点肯定是其最近公共祖先
    else { //否则其中一个值一定是另一个值的祖先
        if (e1 != root->data)ans2 = true;
        else ans1 = true;
        return root->data;
    }
}


int main()
{
#ifdef _DEBUG
    freopen("data.txt", "r+", stdin);
#endif

    std::ios::sync_with_stdio(false);
    int data;
    cin >> M >> N;
    for (int i = 0; i<N; ++i) {
        cin >> data;
        in[i] = pre[i] = data;
        keys.insert(data);
    }
    sort(in, in + N);
    PTNode root = CreateBST(pre, in, 0, N - 1, 0, N - 1);

    while (M--) {
        bool f1flag = true, f2flag = true;
        int e1, e2;
        cin >> e1 >> e2;
        if (keys.find(e1) == keys.end()) f1flag = false;
        if (keys.find(e2) == keys.end()) f2flag = false;

        if (f1flag == false || f2flag == false) {
            if (f1flag && !f2flag) cout << "ERROR: " << e2 << " is not found.\n";
            else if (!f1flag && f2flag) cout << "ERROR: " << e1 << " is not found.\n";
            else cout << "ERROR: " << e1 << " and " << e2 << " are not found.\n";
            continue;
        }
        bool ans1 = false, ans2 = false;
        int LCAD = findLCA(root, e1, e2, ans1, ans2);
        if (ans1)cout << e1 << " is an ancestor of " << e2 << ".\n";
        else if (ans2) cout << e2 << " is an ancestor of " << e1 << ".\n";
        else cout << "LCA of " << e1 << " and " << e2 << " is " << LCAD << ".\n";
    }

    return 0;
}
当前,全球经济格局深刻调整,数字化浪潮席卷各行各业,智能物流作为现代物流发展的必然趋势和关键支撑,正迎来前所未有的发展机遇。以人工智能、物联网、大数据、云计算、区块链等前沿信息技术的快速迭代与深度融合为驱动,智能物流不再是传统物流的简单技术叠加,而是正在经历一场从自动化向智能化、从被动响应向主动预测、从信息孤岛向全面互联的深刻变革。展望2025年,智能物流系统将不再局限于提升效率、降低成本的基本目标,而是要构建一个感知更全面、决策更精准、执行更高效、协同更顺畅的智慧运行体系。这要求我们必须超越传统思维定式,以系统化、前瞻性的视角,全面规划和实施智能物流系统的建设。本实施方案正是基于对行业发展趋势的深刻洞察和对未来需求的精准把握而制定。我们的核心目标在于:通过构建一个集成了先进感知技术、大数据分析引擎、智能决策算法和高效协同平台的综合智能物流系统,实现物流全链路的可视化、透明化和智能化管理。这不仅是技术层面的革新,更是管理模式和服务能力的全面提升。本方案旨在明确系统建设的战略方向、关键任务、技术路径和实施步骤,确保通过系统化部署,有效应对日益复杂的供应链环境,提升整体物流韧性,优化资源配置效率,降低运营成本,并最终为客户创造更卓越的价值体验。我们致力于通过本方案的实施,引领智能物流迈向更高水平,为构建现代化经济体系、推动高质量发展提供强有力的物流保障。
电源题电赛单相并网离网软件硬件锁相环单极性双极性调制等代码及仿真环路计算资料+原理图PCB内容概要:本文档是一份关于电力电子与能源系统仿真研究的技术资料集合,涵盖单相并网/离网系统、软件与硬件锁相环设计、单极性与双极性调制技术、虚拟同步机控制建模、P2G-CCS耦合系统、微电网优化调度、光伏风电联合运行、储能配置及需求响应等多个电力系统核心主题。文档提供了大量基于Matlab/Simulink的代码实现与仿真模型,包括LLC谐振变换器小信号分析、永磁同步电机控制、DC-AC变换器设计、光伏阵列故障仿真、直流微电网建模等,并附有原理图与PCB设计资源。同时整合了智能优化算法(如遗传算法、粒子群、灰狼优化器)、机器学习模型(如LSTM、CNN-GRU-Attention)在负荷预测、故障诊断、路径规划等领域的应用案例,形成一个跨学科的科研资源包。; 适合人群:电气工程、自动化、能源系统及相关专业的研究生、科研人员以及从事电力电子、微电网、新能源控制方向的工程师;具备Matlab/Simulink编程基础和一定电力系统理论知识者更佳。; 使用场景及目标:① 支持电赛或科研项目中对并网逆变器、锁相环、调制策略的设计与验证;② 用于复现高水平论文(如EI/SCI)中的优化调度、控制算法与仿真模型;③ 辅助开展微电网能量管理、储能配置、需求响应策略等课题的研究与代码开发;④ 提供可直接调用的算法模板与仿真平台,提升科研效率。; 阅读建议:建议按照文档结构逐步浏览,优先下载并整理网盘中的完整资源包,结合具体研究方向选取对应代码与模型进行调试与二次开发;对于复杂算法(如NSGA-II、ADMM、MPC),应配合文献理解其数学原理后再实施仿真;关注其中“论文复现”类内容以提升学术研究规范性与技术深度。
以下是C#中二叉树的lowest common ancestor的源代码: ```csharp using System; public class Node { public int value; public Node left; public Node right; public Node(int value) { this.value = value; this.left = null; this.right = null; } } public class BinaryTree { public Node root; public BinaryTree() { this.root = null; } public Node LowestCommonAncestor(Node node, int value1, int value2) { if (node == null) { return null; } if (node.value == value1 || node.value == value2) { return node; } Node left = LowestCommonAncestor(node.left, value1, value2); Node right = LowestCommonAncestor(node.right, value1, value2); if (left != null && right != null) { return node; } return (left != null) ? left : right; } } public class Program { public static void Main() { BinaryTree tree = new BinaryTree(); tree.root = new Node(1); tree.root.left = new Node(2); tree.root.right = new Node(3); tree.root.left.left = new Node(4); tree.root.left.right = new Node(5); tree.root.right.left = new Node(6); tree.root.right.right = new Node(7); Node lca = tree.LowestCommonAncestor(tree.root, 4, 5); Console.WriteLine("Lowest Common Ancestor of 4 and 5: " + lca.value); lca = tree.LowestCommonAncestor(tree.root, 4, 6); Console.WriteLine("Lowest Common Ancestor of 4 and 6: " + lca.value); lca = tree.LowestCommonAncestor(tree.root, 3, 4); Console.WriteLine("Lowest Common Ancestor of 3 and 4: " + lca.value); lca = tree.LowestCommonAncestor(tree.root, 2, 4); Console.WriteLine("Lowest Common Ancestor of 2 and 4: " + lca.value); } } ``` 在上面的代码中,我们定义了一个Node类和一个BinaryTree类。我们使用BinaryTree类来创建二叉树,并实现了一个LowestCommonAncestor方法来计算二叉树中给定两个节点的最近公共祖先。 在LowestCommonAncestor方法中,我们首先检查给定节点是否为null或与给定值之一匹配。如果是,则返回该节点。否则,我们递归地在左子树和右子树上调用LowestCommonAncestor方法,并检查它们的返回值。如果左子树和右子树的返回值都不为null,则当前节点是它们的最近公共祖先。否则,我们返回非null的那个子树的返回值。 在Main方法中,我们创建了一个二叉树,并测试了LowestCommonAncestor方法的几个不同输入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值