微软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));
    }
}


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

程序员面试题精选100题(39)-颠倒栈

http://zhedahht.blog.163.com/blog/static/25411174200943182411790/ 题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4,...
  • ZCSYLJ
  • ZCSYLJ
  • 2011年09月29日 17:03
  • 247

程序员面试题精选100题(39)-颠倒栈[数据结构]

题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。 分析:乍一看到这道题目,第一反应是把栈里的所有元素逐一po...

程序员面试题精选100题(39)-颠倒栈

程序员面试题精选100题(39)-颠倒栈 题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。 ...

横空出世,席卷互联网--评微软等公司数据结构+算法面试100题

作者:July。 时间:2010年10月-11月。版权所有,侵权必究。 出处:http://blog.csdn.net/v_JULY_v。 说明:本文原题为:“横空出世,席卷Csdn [评微软等...

微软面试100题2010年版全部答案集锦(含下载地址)

http://blog.csdn.net/szu030606/article/details/7213369   微软等数据结构+算法面试100题全部答案集锦 ...

微软面试100题2010年版全部答案集锦(含下载地址)

原作者地址:http://blog.csdn.net/v_july_v/article/details/6870251   微软等数据结构+算法面试100题全部答案集锦 ...

横空出世,席卷互联网--评微软等公司数据结构和算法面试100题

横空出世,席卷互联网                      ---评微软数据结构+算法面试100题 作者:July。 时间:2010年10月-11月。版权所有,侵权必究。 出处:h...

横空出世,席卷互联网--评微软等公司数据结构+算法面试100题

[置顶] 横空出世,席卷互联网--评微软等公司数据结构+算法面试100题 分类: 10.MS 100' comments 2010-11-17 16:30 79010人阅读 评论(23...

微软等数据结构+算法面试100题全部答案集锦

1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ ...

【微软100题】定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。

package test; /** * 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:微软100题,39题
举报原因:
原因补充:

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