题目描述:

给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先。

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数。
其中每个测试样例包括两行,第一行为一个二叉树的先序遍历序列,其中左右子树若为空则用0代替,其中二叉树的结点个数node_num<10000。
第二行为树中的两个结点的值m1与m2(0<m1,m2<10000)。

输出:

对应每个测试案例,
输出给定的树中两个结点的最低公共祖先结点的值,若两个给定结点无最低公共祖先,则输出“My God”。

样例输入:
2
1 2 4 6 0 0 7 0 0 5 8 0 0 9 0 0 3 0 0
6 8
1 2 4 6 0 0 7 0 0 5 8 0 0 9 0 0 3 0 0
6 12
样例输出:
2
My God
#include <cstdio>
#include <iostream>
#include <list>
using namespace std;struct Node{int x;struct Node *left;struct Node *right;};int path1[10000],path2[10000];
int top1 = -1,top2 = -1;
void createTree(Node *&root){int x;scanf("%d",&x);if(!x)root = NULL;else{root = new Node;root->x = x;createTree(root->left);createTree(root->right);}
}bool getPath(Node *root,int x,int path[],int &top){path[++top] = root->x;if(root->x == x)return true;bool found = false;if(root->left)found = getPath(root->left,x,path,top);if(!found && root->right)found = getPath(root->right,x,path,top);if(!found)top--;return found;
}int getCommonNode(int path1[],int path2[]){int x;int i = 0,j = 0;while(i <= top1 && j <= top2){if(path1[i] == path2[j])x = path1[i];i++;j++;}return x;
}void destory(Node *&root){if(root){destory(root->left);destory(root->right);delete root;root = NULL;}
}void print(Node *root){if(root){printf("%d ",root->x);print(root->left);print(root->right);}
}int main(int argc, char const *argv[])
{int n,a,b;while(scanf("%d",&n) != EOF){while(n--){Node *root;createTree(root);scanf("%d %d",&a,&b);top1 = -1;top2 = -1;if(!getPath(root,a,path1,top1)){printf("My God\n");continue;}if(!getPath(root,b,path2,top2)){printf("My God\n");continue;}destory(root);printf("%d\n",getCommonNode(path1,path2)); }}return 0;
}

转载于:https://www.cnblogs.com/snake-hand/p/3170135.html

树中两个结点的最低公共祖先相关推荐

  1. 50:树中两个结点的最低公共祖先

    题目:求树中两个结点的最低公共祖先,此树不是二叉树,并且没有指向父节点的指针. 树的结点定义 private static class TreeNode {int val;List<TreeNo ...

  2. 寻找树中两个结点的最低公共祖先

    寻找树中两个结点的最低公共祖先 Q:在树中寻找两个结点的最低公共祖先,是什么意思呢? A:树是由根节点衍生左右孩子继续衍生左右孩子的左右孩子.所以呢树中的两个结点是一定拥有最低公共祖先(这两个结点Q: ...

  3. Lowest Common Ancestor of a Binary Search Tree(树中两个结点的最低公共祖先)

    题目描述: Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in ...

  4. 寻找二叉树中两个结点的最近公共祖先

    寻找二叉树中两个结点的最近公共祖先(这两个结点一定在树中) 对于二叉树中两个结点的最近公共祖先来说 ,这两个结点分别在自己的左子树和右子树中,所以要寻找二叉树中两个结点的最近公共祖先可以: 从根结点开 ...

  5. 求二叉树两个结点的最近公共祖先

    题目描述: 一颗二叉树按顺序存储结构进行存储,设计一个算法,求编号i和j的最近公共祖先 思路: 已知:二叉树.顺序存储 空的结点用"#"表示 如果i,j所在位置的结点数据不是&qu ...

  6. 二叉树两个结点的最低公共父结点 【微软面试100题 第七十五题】

    题目要求: 输入二叉树中的两个结点,输出这两个及诶单在数中最低的共同父结点. 题目分析: 还有一种情况:如果输入的两个结点中有一个或两个结点不在二叉树中,则输出没有共同父结点: 因此,可以在程序中定义 ...

  7. 二叉树找到两个结点的最近公共祖先

    面试题68 - I. 二叉搜索树的最近公共祖先 https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu- ...

  8. 二叉树中找两个结点的最近公共祖先结点

    一.搜索二叉树:第一变种是二叉树是一种特殊的二叉树:查找二叉树.也就是树是排序过的,位于左子树上的结点都比父结点小,而位于右子树的结点都比父结点大.我们只需要从根结点开始和两个结点进行比较.如果当前结 ...

  9. 树如何找共同祖先_如何找到任何二叉树中两个节点的最低公共祖先?

    小编典典 尼克·约翰逊是正确的,一个一个O(n)的时间复杂度算法是最好的,如果你没有父指针,你可以做.)对于算法的一个简单的递归版本中看到代码金丁的职务)它运行在O(n)的时间. 但是请记住,如果您的 ...

最新文章

  1. 免费Windows系统服务器,免费试用人数太多,Windows 365云电脑服务器炸了,官方紧急暂停...
  2. C#里partial关键字的作用(转摘)
  3. openstack管理员手册下载_城市绿心森林公园app下载-城市绿心森林公园客户端下载v1.1 安卓版...
  4. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170322
  5. 【Qt】数据库实战(一)
  6. Scrapy爬虫(8)scrapy-splash的入门
  7. CentOS Vi编辑器
  8. C++新特性探究(六):auto
  9. mysql 5.7.18源码包下载_centos 7 下MySQL 5.7.18 源码安装
  10. 系统架构设计师之备考攻略(2022年修订版)——一篇就够
  11. 【软件相关】Proteus 8入门教程
  12. Ubuntu上完美运行QQ
  13. CR95HF操作命令介绍
  14. Memory Limit Exceeded
  15. 安装miktex+winedit
  16. AddressBook获取用户信息
  17. 根据配置好的图层文件(*.lyr),对加载的栅格数据进行渲染!
  18. 主板螺丝是机箱配还是主板配_MATX主板配什么机箱好?曜越Tt启航者A3装机记
  19. 阿里云-邮件推送 配置 购买域名 配置域名
  20. 低代码、高敏捷的智和网管平台,运维平台二次开发极简化

热门文章

  1. 「基本功」不可不说的Java“锁”事
  2. SELECT COUNT(*) 底层究竟干了啥么?
  3. 干货 | 强化学习在携程酒店推荐排序中的应用探索
  4. 我们来谈下高并发和分布式中的幂等处理
  5. 这大概是一篇最简单最清晰的Java JVM执行流程
  6. 事物运动的状态和方式是谁提出的_金属材料在电磁场中的行为方式及其与光电效应的关系分析...
  7. 万物互联时代的边缘计算
  8. 高标准,严要求!数据中心发电机组的调试与验收工作
  9. 地球上环境最恶劣的数据中心
  10. 细数:数据中心机房对环境的严格要求有哪些?