首页 > 其他分享 >1151 LCA in a Binary Tree

1151 LCA in a Binary Tree

时间:2023-05-28 10:12:56浏览次数:42  
标签:Binary 结点 int Tree LCA 1151 ERROR inRoot found

题目:

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.

Given any two nodes in a binary tree, 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 (≤1,000), the number of pairs of nodes to be tested; and N (≤10,000), the number of keys in the binary tree, respectively. In each of the following two lines, N distinct integers are given as the inorder and preorder traversal sequences of the binary tree, respectively. It is guaranteed that the binary tree can be uniquely determined by the input sequences. 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 Yis the other node. If U or V is not found in the binary tree, 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
7 2 3 4 6 5 1 8
5 3 7 2 6 4 8 1
2 6
8 1
7 9
12 -3
0 8
99 99
 

Sample Output:

LCA of 2 and 6 is 3.
8 is an ancestor of 1.
ERROR: 9 is not found.
ERROR: 12 and -3 are not found.
ERROR: 0 is not found.
ERROR: 99 and 99 are not found.

 

题目大意:给出中序序列和先序序列,再给出两个点,求这两个点的最近公共祖先

思路:在不构建树的情况下,在每一层的递归中,可以得到树的根结点,在此时并入lca算法,若a和b在根结点的左边,则a和b的最近公共祖先在当前子树根结点的左子树寻找,如果a和b在当前子树根结点的两边,在当前子树的根结点就是a和b的最近公共祖先,如果a和b在当前子树根结点的右边,则a和b的最近公共祖先就在当前子树的右子树寻找,从而可以确定两个结点的公共祖先

 

代码:(满分)

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<map>
using namespace std;
int n,m;
int inorder[10005], preorder[10005];
map<int, int> flag;
void lca(int inL, int inR, int preL, int u, int v){
    if(inL > inR){
        return;
    }
    int inRoot = flag[preorder[preL]], inU = flag[u], inV = flag[v];
    if(inU < inRoot && inV < inRoot){
        lca(inL, inRoot - 1, preL + 1, u, v);
    }else if((inU < inRoot && inV > inRoot) || (inU > inRoot && inV < inRoot)){
        printf("LCA of %d and %d is %d.\n", u, v, inorder[inRoot]);
    }else if(inU > inRoot && inV > inRoot){
        lca(inRoot + 1, inR, preL + 1 + (inRoot - inL), u, v);
    }else if(inU == inRoot){
        printf("%d is an ancestor of %d.\n", u, v);
    }else if(inV == inRoot){
        printf("%d is an ancestor of %d.\n", v, u);
    }
}

int main(){
    scanf("%d%d", &m, &n);
    for(int i = 1; i <= n; i++){
        scanf("%d", &inorder[i]);
        flag[inorder[i]] = i;
    }
    for(int i = 1; i <= n; i ++){
        scanf("%d", &preorder[i]);
    }
    // Node * root = build(0, n - 1, 0, n - 1);
    for(int i = 0; i < m; i++){
        int u,v;
        scanf("%d%d", &u, &v);
        if(flag[u] == 0 && flag[v] == 0){
            printf("ERROR: %d and %d are not found.\n", u, v);
        }else if(flag[u] == 0 || flag[v] == 0){
            printf("ERROR: %d is not found.\n", flag[u] == 0 ? u : v);
        }
        else{
            lca(1, n, 1, u, v);
        }
    }
    return 0;
}

 

标签:Binary,结点,int,Tree,LCA,1151,ERROR,inRoot,found
From: https://www.cnblogs.com/yccy/p/17437833.html

相关文章

  • 【技术分享】万字长文图文并茂读懂高性能无锁 “B-Tree 改”:Bw-Tree
    【技术分享】万字长文图文并茂读懂高性能无锁“B-Tree改”:Bw-Tree原文链接:https://mp.weixin.qq.com/s/I5TphQP__tHn6JoPcP--_w参考文献不一定能下载。如果你获取不到这几篇论文,可以关注公众号IT技术小密圈回复bw-tree获取。一.背景Bw-Tree希望实现以下能力:解决......
  • 力扣 662 https://leetcode.cn/problems/maximum-width-of-binary-tree/
    需要了解树的顺序存储如果是普通的二叉树,底层是用链表去连接的如果是满二叉树,底层用的是数组去放的,而数组放的时候会有索引对应当前父节点是索引i,下一个左右节点就是2i,2i+1利用满二叉树的索引特征所以需要对每个节点进行一个索引赋值,赋值在队列中,队列用数组表示核心代码......
  • Paper Reading: Adaptive Neural Trees
    目录研究动机文章贡献自适应神经树模型拓扑与操作概率模型与推理优化实验结果模型性能消融实验可解释性细化阶段的影响自适应模型复杂度优点和创新点PaperReading是从个人角度进行的一些总结分享,受到个人关注点的侧重和实力所限,可能有理解不到位的地方。具体的细节还需要以原文......
  • Cassandra中的MerkleTree反熵机制
    构建MerkleTreeCassandra是一个分布式数据库系统,它使用Merkle树来实现数据一致性和数据完整性的验证。在Cassandra中,每个节点都维护着自己的数据副本。为了确保数据的一致性和完整性,Cassandra使用Merkle树进行验证。Merkle树是一种树状结构,由哈希值构成,用于对数据块进......
  • 107. Binary Tree Level Order Traversal II刷题笔记
    问题描述自底向上层序搜索python代码#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:deflevelOrd......
  • 102. Binary Tree Level Order Traversal刷题笔记
    考察二叉树的层序遍历问题描述leetcode代码:#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:deflev......
  • 94. Binary Tree Inorder Traversal刷题笔记
    问题描述中序遍历,用的是递归法,当然也可以用迭代法(栈)代码#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution......
  • 145. Binary Tree Postorder Traversal刷题笔记
    问题描述后序遍历代码:#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:defpostorderTraversal(sel......
  • 144. Binary Tree Preorder Traversal刷题笔记
    问题描述前序遍历。注意嵌套函数里的list应该用append而不是+=来添加元素#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=right......
  • 897. Increasing Order Search Tree
    问题描述yield就是return返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始。如果是迭代器则应该使用yieldfromclassTreeNode(object):def__init__(self,x):self.val=xself.left=Noneself.right=None#树生成代......