1. 二叉树最近公共祖先

 
 
奇安信集团 2020校招 服务端开发-应用开发方向在线考试
编程题|20分2/2
寻祖问宗
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
姓氏是人的符号标志,是家族血脉的传承;族谱是家族血脉传承的文字记载。同姓的两个中国人,根据族谱或许能够查出上面几代内是同一个祖先。查一下族谱,也许当代某位同姓名人就是你的远房亲戚,惊喜不惊喜,意外不意外!!! 输入
二元查找树(1.若左子树不空,左子树值都小于父节点;2.如右子树不空,右子树值都大于父节点;3.左、右子树都是二元查找树;4. 没有键值相等的节点)上任意两个节点的值,请找出它们最近的公共祖先。

输入三行行,第一行为树层级,第二行为数节点(其中-1表示为空节点),第三行为需要查找祖先的两个数。

在例图中(虚线框没有真实节点,为了输入方便对应位置输-1)查找12和20的最近公共祖先输入为:
4
9 6 15 2 -1 12 25 -1 -1 -1 -1 -1 -1 20 37
12 20 输出
输出给出两个数在树上的最近公共祖先数值,如果没有公共祖先,输出-1;如果其中一个节点是另一个节点的祖先,输出这个祖先点(如例图中找15、20最近公共祖先,输出15);如果输入无效,输出-1。 样例输入
4
9 6 15 2 -1 12 25 -1 -1 -1 -1 -1 -1 20 37
12 20
样例输出
15

解题思路:

从根节点开始遍历树。
如果当前节点本身是 p 或 q 中的一个,我们会将变量 mid 标记为 true,并继续搜索左右分支中的另一个节点。
如果左分支或右分支中的任何一个返回 true,则表示在下面找到了两个节点中的一个。
如果在遍历的任何点上,左、右或中三个标志中的任意两个变为 true,这意味着我们找到了节点 p 和 q 的最近公共祖先。 作者:LeetCode
链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/solution/er-cha-shu-de-zui-jin-gong-gong-zu-xian-by-leetcod/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

代码,全A:

import java.util.LinkedList;
import java.util.Scanner; public class Main{
static class TreeNode{
int value;
TreeNode left;
TreeNode right;
public TreeNode(int value){
this.value = value;
}
}
public static TreeNode root;
public static TreeNode p;
public static TreeNode q;
public static TreeNode commonfather;
public static void main(String[] args) { /***********************层次创建二叉树***********************/
Scanner sc = new Scanner(System.in);
int depth = sc.nextInt();
sc.nextLine();
String[] array1 = sc.nextLine().trim().split(" ");
int pval = sc.nextInt();
int qval = sc.nextInt();
int len = array1.length;
int[] intlevelarray = new int[len];
for (int i = 0; i < len; i++) {
intlevelarray[i] = Integer.valueOf(array1[i]);
}
root = level_buildBTree(intlevelarray,-1,pval,qval);
boolean result = recurseTree(root, p, q);
if(result && commonfather!=null){
System.out.println(commonfather.value);
}else{
System.out.println(-1);
} }
/**层次遍历创建二叉树*/
public static TreeNode level_buildBTree(int[]array,int flag, int pval, int qval){
int len = array.length;
//将数组转成list
LinkedList<TreeNode> list = new LinkedList<>();
for (int i = 0; i < len; i++) {
TreeNode temp = new TreeNode(array[i]);
if(array[i]==pval){
p = temp;
}
if(array[i]==qval){
q = temp;
}
list.add(temp);
}
//开始构建树
for (int i = 0; i < len/2; i++) {
list.get(i).left = list.get(2*i+1).value!=flag?list.get(2*i+1):null;
//记得处理最后一个父节点(len/2-1),因为有可能没有右孩子。
if(i<len/2-1 ||(i==len/2-1&& len%2!=0)){
list.get(i).right = list.get(2*i+2).value!=flag?list.get(2*i+2):null;
}
}
return list.get(0);
} /**
* 二叉树的最近公共祖先
* @param currNode 当前节点
* @param p 第一个孩子
* @param q 第二个孩子
* @return
*/
public static boolean recurseTree(TreeNode currNode, TreeNode p, TreeNode q){
if(currNode == null){
return false;
}
int left = recurseTree(currNode.left, p, q)?1:0;
int right = recurseTree(currNode.right, p, q)?1:0;
int mid = (currNode==p || currNode==q)?1:0;
if(mid+left+right>=2){
commonfather = currNode;
}
return mid+left+right>0;
}
}

2. 杀死进程

题目描述:

奇安信集团 2020校招 服务端开发-应用开发方向在线考试
编程题 | 20.0分1/2
结束进程树
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
给定n个进程,这些进程满足以下条件: (1)每个进程有唯一的PID,其中PID为进程ID (2)每个进程最多只有一个父进程,但可能有多个子进程,用PPID表示父进程ID (3)若一个进程没有父进程,则其PPID为0 (4)PID、PPID都是无符号整数 结束进程树的含义是当结束一个进程时,它的所有子进程也会被结束,包括子进程的子进程。 现在给定大小为n的两组输入列表A和B(1 <= n <= 100),列表A表示进程的PID列表,列表B表示列表A对应的父进程的列表,即PPID列表。 若再给定一个PID,请输出结束该PID的进程树时总共结束的进程数量。 输入
3 1 5 21 10 0 3 3 1 5 5 输出
2 样例输入
3 1 5 21 10
0 3 3 1 5
3 样例输出
5

解题思路:

https://www.cnblogs.com/yoke/p/9770528.html

代码,91%

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner; public class Main3 {
public static int[] pid ;
public static int[] ppid ;
public static void main( String[] args ) {
Scanner sc = new Scanner(System.in);
String[] a = sc.nextLine().trim().split(" ");
String[] b = sc.nextLine().trim().split(" ");
int kill = sc.nextInt();
pid = new int[a.length];
ppid = new int[b.length];
for (int i = 0; i < a.length; i++) {
pid[i]= Integer.valueOf(a[i]);
}
for (int i = 0; i < b.length; i++) {
ppid[i]=Integer.valueOf(b[i]);
}
List<Integer> result = killpid(kill);
if(result!=null){
System.out.println(result.size());
}else{
System.out.println(0);
}
} public static List<Integer> killpid(int kill){
List<Integer> result = new ArrayList<Integer>();
result.add(kill);
for (int i = 0; i < ppid.length; i++) {
if(ppid[i]==kill){
result.addAll(killpid(pid[i]));
}
}
return result;
}
}

奇安信集团笔试题:二叉树的最近公共祖先(leetcode236),杀死进程(leetcode582)的更多相关文章

  1. Leetcode:面试题68 - II. 二叉树的最近公共祖先

    Leetcode:面试题68 - II. 二叉树的最近公共祖先 Leetcode:面试题68 - II. 二叉树的最近公共祖先 Talk is cheap . Show me the code . / ...

  2. 剑指 Offer 68 - II. 二叉树的最近公共祖先 + 最近公共祖先(LCA)

    剑指 Offer 68 - II. 二叉树的最近公共祖先 Offer_68_2 题目详情 题解分析 java代码 package com.walegarrett.offer; /** * @Autho ...

  3. 编程算法 - 二叉树的最低公共祖先 代码(C)

    二叉树的最低公共祖先 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 二叉树的最低公共祖先(lowest common ancestor), 首先先序遍 ...

  4. Leetcode 236.二叉树的最近公共祖先

    二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x ...

  5. LeetCode236. 二叉树的最近公共祖先

    * @lc app=leetcode.cn id=236 lang=cpp  *  * [236] 二叉树的最近公共祖先  *  * https://leetcode-cn.com/problems/ ...

  6. Java实现 LeetCode 236 二叉树的最近公共祖先

    236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x ...

  7. 剑指 Offer 68 - II. 二叉树的最近公共祖先

    剑指 Offer 68 - II. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近 ...

  8. 面试题68 - II. 二叉树的最近公共祖先

    <搜索树结点> <获取路径> 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q ...

  9. 《剑指offer》面试题68 - II. 二叉树的最近公共祖先

    问题描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q ...

随机推荐

  1. Codeforces Round #594 (Div. 1) A. Ivan the Fool and the Probability Theory 动态规划

    A. Ivan the Fool and the Probability Theory Recently Ivan the Fool decided to become smarter and stu ...

  2. node 连接 mysql 数据库三种方法------笔记

    一.mysql库 文档:https://github.com/mysqljs/mysql mysql有三种创建连接方式 1.createConnection 使用时需要对连接的创建.断开进行管理 2. ...

  3. P站全新官方精选集Pixivision

    P站是一个主要由日本艺术家所组成的虚拟社群,主打插画.漫画.二次元作品网上沟通. 不过好消息是,P站全新的精选网站Pixivision上线了,多种语言界面,国内用户访问毫无压力. 近期精选的一系列作品 ...

  4. 练手WPF(三)——扫雷小游戏的简易实现(上)

    一.创建项目1.创建WPF项目,设置初始化窗口大小(初级难度):高x宽为430x350.2.添加文件夹Images,并添加相关图片. 3.xaml中引入图片资源. <Window.Resourc ...

  5. PHP语法入门以及变量

    1PHP语法入门 1.1PHP是编译型语言      编译语言和解释语言的区别在于是否保存最终的可执行程序. 1.2PHP定界符       因为PHP是脚本语言,所以需要定界符 <?php e ...

  6. String与StringBuilder性能比对

    //String与StringBuilder性能比对package seday01;/** * String修改字符串带来的性能开销 * @author xingsir * */public clas ...

  7. 怎么在CAD中测量图纸距离?来看看这两种方法

    在CAD中设计图纸最重要的就是图纸的尺寸,俗话说也就是图纸间的距离.通过正确的数据设计出的图纸才能够准确,也能够避免施工时事不必要的误差.那怎么在CAD中测量图纸距离呢?具体要怎么来进行操作呢?下面我 ...

  8. 敏捷软件开发_实例2<四>

    敏捷软件开发_实例2 上一章中对薪水支付案例的用例和类做了详细的阐述,在本篇会介绍薪水支付案例包的划分和数据库,UI的设计. 包的划分 一个错误包的划分 为什么这个包是错误的: 如果对classifi ...

  9. CSS animation 属性

    定义和用法 animation属性是下列属性的一个缩写属性: animation-name animation-duration animation-timing-function animation ...

  10. plus.webview.create 使用方法

    plus.webview.create( "xxx.html", //打开页面地址 "xxx", //打开页面id值 { //窗口样式 width: '100% ...