微软100题,39题

原创 2015年07月07日 16:35:52

39.(树、图、算法)
网易有道笔试:
(1).
求一个二叉树中任意两个节点间的最大距离,
两个节点的距离的定义是 这两个节点间边的个数,
比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。

(2).
求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边,
有向图不再连通,描述算法。


import java.util.Random;

/**
 * <p>File:Test_39_1.java</p>
 * <p>Title: </p>
 * @version 1.0
 * 39.(树、图、算法)
网易有道笔试:
(1).
求一个二叉树中任意两个节点间的最大距离,
两个节点的距离的定义是 这两个节点间边的个数,
比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。

 */
public class Test_39_1
{
    private static Node root;
    
    private static class Node
    {
        private Node parent;

        private Node left;

        private Node right;
        
        private int depth;
        
        
        public Node(){}
        
        public Node(Node parent, Node left, Node right)
        {
            super();
            this.parent = parent;
            this.left = left;
            this.right = right;
        }

        public int getDepth()
        {
            return depth;
        }

        public void setDepth(int depth)
        {
            this.depth = depth;
        }

        public Node getParent()
        {
            return parent;
        }

        public void setParent(Node parent)
        {
            this.parent = parent;
        }

        public Node getLeft()
        {
            return left;
        }

        public void setLeft(Node left)
        {
            this.left = left;
        }

        public Node getRight()
        {
            return right;
        }

        public void setRight(Node right)
        {
            this.right = right;
        }
    }

    private static void buildBinaryTree()
    {
        Node left=new Node();
        Node right=new Node();
        root=new Node(null,left,right);
        root.setDepth(0);
        left.setParent(root);
        right.setParent(root);
        left.setDepth(1);
        right.setDepth(1);
        buildNode(left);
        buildNode(right);
    }
    
    private static void buildNode(Node node){
        if(node.depth>10){
            return;
        }
        Node left=new Node();
        Node right=new Node();
        left.setDepth(node.getDepth()+1);
        right.setDepth(node.getDepth()+1);
        left.setParent(node);
        right.setParent(node);
        node.setLeft(left);
        node.setRight(right);
        buildNode(node.getLeft());
        buildNode(node.getRight());
    }
    
    private static Node getRandomNode(){
        Random random=new Random();
        Node result=root;
        Random depthR=new Random();
        int d=depthR.nextInt(10);
        for(int i=0;i<d;i++){
            boolean lr=random.nextBoolean();
            if(lr){
                result=result.getLeft();
            }else{
                result=result.getRight();
            }
        }
        return result;
    }
    
    private static void printTree(){
        System.out.println("--0");
        printNode(root.getLeft());
        printNode(root.getRight());
        
    }
    
    private static void printNode(Node node){
        if(node==null){
            return;
        }
        String str="";
        for(int i=0;i<node.getDepth()*2;i++){
            str+="--";
        }
        System.out.println(str+node.depth);
        printNode(node.getLeft());
        printNode(node.getRight());
    }
    
    private static int computeDistance(Node a,Node b){
        if(a==b){
            return 0;
        }
        if(a.depth==b.depth&&a.parent==b.parent){
            return 2;
        }else if(a.depth==b.depth){
            return computeDistance(a.parent,b.parent)+2;  
        }else{
            if(a.depth>b.depth){
                return computeDistance(a.parent,b)+1;
            }else{
                return computeDistance(a,b.parent)+1;
            }
        }
    }
    
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        buildBinaryTree();
        printTree();
        Node a=getRandomNode();
        Node b=getRandomNode();
        System.out.println("a.深度:"+a.getDepth()+","+"b的深度:"+b.getDepth()+",两节点的长度是:"+computeDistance(a,b));
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

阿里2015实习生招聘在线测试----编程题,设计有限任务响应队列

讨论帖子: http://bbs.csdn.net/topics/391009829 解决方案: #include #include #include #include #...

阿里17在线编程测验

这貌似是今年阿里JAVA在线编程测验题目,我把它转为C++做出来了,欢迎大家提出建议。 #include #include using namespace std; bool CheckMiddl...

阿里笔试题(2017在线编程题)-- 数串分组

博客链接: http://codeshold.me/2017/03/alialgorithm.html题目2017年3月阿里在线编程题(实习内推) 给定一串数字 判断是否存在这三个元素,它们...

阿里腾讯2016校招在线笔试有感

今年有一个数字听起来很可怕。阿里的网申数量去到170W(还未截至网申的数字),技术类毫无疑问是最多的,我估计会超过100W的技术网申。更加悲剧的是,原计划3000个校招名额突然缩减85%,最后只留下1...

阿里应届生招聘在线编程测验

招聘

阿里2017年-图形图像算法工程师-在线编程题目

这题是我今年写的在线编程题目,说一下我的思路:先通过正态分布随机函数求出X,Y点的集合,后将X,Y排列组合,得出不同坐标代入曲线方程,得出概率。 大家有不同思路,欢迎一起讨论。今年是研一,估计没什么进...

ACE 安装指南

The ADAPTIVE Communication Environment (ACE) 是一套免费的、开源的面向对象框架,它为大规模并发通信软件实现了许多核心的设计模式。ACE提供了一套丰富的、可重...

今天阿里巴巴让我在线编程

与阿里巴巴的面试也有好几次了,最早是在好几年前,我初出茅庐,电话面试啥也不懂。都是心酸史。今天阿里巴巴让我在线写一段程序,在一个网页上,他们能在线看见我在写什么。 题目是:实现一个缓存容器,支持容量...

阿里编程测验题

转载自http://m.blog.csdn.net/u010292329/article/details/75209379 题目: 一条RNA是一根链状的核酸链。其上的核酸序列被称为RNA的一级结...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)