zoukankan      html  css  js  c++  java
  • A1151 LCA in a Binary Tree [先序中序建树找祖先]

    在这里插入图片描述
    对LCA递归的理解: (代码参考的大佬 理解这个花了蛮久 唉老蠢啦)
    什么是什么的父节点就是搜索到这个结点的值等于u或者v就停下来
    然后它是先往左边右边进行搜索,搜索到第一个结点的儿子节点相等的 就是最高的就停下来了,如果右边找不到 说明另一个还没找到的结点在左边已经找到的结点的更深处。

    #include<iostream>
    #include<vector>
    #include<map>
    #include<string>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<set>
    #include<queue>
    #include<unordered_map>
    #include<cmath>
    using namespace std;
    const int maxn = 10010;
    int m,n;
    struct node
    {
    	int data;
    	node* left, * right;
    };
    int in[maxn], pre[maxn];
    node* buildtree(int prel, int prer, int inl, int inr)
    {
    	if (prel > prer)
    		return NULL;
    	node* root = new node;
    	root->data = pre[prel];
    	int i;
    	for (i = inl; i <= inr; i++)
    	{
    		if (in[i] == pre[prel])
    		{
    			break;
    		}
    	}
    	int leftnum = i - inl;
    	root->left = buildtree(prel + 1, prel + leftnum, inl, i - 1);
    	root->right = buildtree(prel + leftnum + 1, prer, i + 1, inr);
    	return root;
    }
    
    bool findnode(int u)
    {
    	for (int i = 0; i < n; i++)
    	{
    		if (u == pre[i])
    			return true;
    	}
    	return false;
    }
    
    node* LCA(node* root, int u, int v)
    {
    	if (root == NULL) return NULL;
    	if (root->data == u || root->data == v) return root;
    	node* left = LCA(root->left, u, v);
    	node* right = LCA(root->right, u, v);  
    	if (left && right) return root;
    	return left == NULL ? right : left;
    }
    
    int main()
    {
    	cin >> m >> n; int u, v;
    	for (int i = 0; i < n; i++)
    	{
    		cin >> in[i];
    	}
    	for (int i = 0; i < n; i++)
    	{
    		cin >> pre[i];
    	}
    	node* root = buildtree(0, n - 1, 0, n - 1);
    	for (int i = 0; i < m; i++)
    	{
    		cin >> u >> v;
    		if (findnode(u) == false && findnode(v) == false)
    		{
    			printf("ERROR: %d and %d are not found.
    ", u, v);
    		}
    		else if (findnode(u) == false || findnode(v) == false)
    		{
    			printf("ERROR: %d is not found.
    ", findnode(u) == false ? u : v);
    		}
    		else
    		{
    			node* temp = LCA(root, u, v);
    			if (temp->data == u || temp->data == v) {
    				printf("%d is an ancestor of %d.
    ", temp->data == u ? u : v, temp->data == u ? v : u);
    			}
    			else {
    				printf("LCA of %d and %d is %d.
    ", u, v, temp->data);
    			}
    		}
    	}
    
    }
    
  • 相关阅读:
    【bzoj1408】 Noi2002—Robot
    【bzoj3884】 上帝与集合的正确用法
    【bzoj2190】 SDOI2008—仪仗队
    【uoj264】 NOIP2016—蚯蚓
    【uoj262】 NOIP2016—换教室
    【uoj261】 NOIP2016—天天爱跑步
    python sort 和sorted排序
    mkdir: cannot create directory ‘/soft/hadoop-2.7.3/logs’: Permission denied问题
    RuntimeError: implement_array_function method already has a docstring
    flask 的orm
  • 原文地址:https://www.cnblogs.com/Hsiung123/p/13811947.html
Copyright © 2011-2022 走看看