论坛首页 Java企业应用论坛

一道关于树的面试题

浏览 6397 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-10-13   最后修改:2011-10-14

    记得不久以前有道面试题,要求下面的数据结构




 
 
    里面每一项都是一个id和一个name,并且,要求能够通过name来返回id。

 

    我当时是用一个树结构来实现的,代码如下:

package cn.lettoo;

import java.util.ArrayList;
import java.util.List;

public class TreeNode {

    //父节点
    private TreeNode parent = null;

    private int id;

    private String name;

    // 子节点,一个节点可以有0至多个子节点
    private List<TreeNode> children = new ArrayList<TreeNode>();

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    // 构造函数,通过传入的父结点来生成此父节点的子节点
    public TreeNode(TreeNode parent, int id, String name) {
        this.parent = parent;
        this.id = id;
        this.name = name;

        if (parent != null) {
            parent.children.add(this);
        }
    }

    // 为当前节点加子节点
    public TreeNode addChild(int id, String name) {
        TreeNode child = new TreeNode(this, id, name);
        return child;
    }

    // 通过name来查询树中是否有这样命名的节点,如果有,返回此节点。
    public TreeNode hasChild(String name) {
        if (name.equals(this.name)) {
            return this;
        }

        // 这里使用递归的方法来遍历所有子节点,如果result有值,则跳出直接返回。
        TreeNode result = null;
        for (TreeNode child : this.children) {
            result = child.hasChild(name);
            if (result != null) {
                break;
            }
        }

        return result;
    }

    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append(String.format("id=%d, ", this.id));
        sb.append(String.format("Name=%s ", this.name));

        if (!this.children.isEmpty()) {
            sb.append(", children=[");
            for (TreeNode child : this.children) {
                sb.append(child.toString());
            }
            sb.append("]");
        }

        return sb.toString();
    }
}

 

    测试代码如下:

package cn.lettoo;

import java.util.Scanner;

/**
 * @author Jeffrey
 */
public class TreeTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        TreeNode tree = new TreeNode(null, 2, "sally");

        // 2,sally -> 3,joe -> 5,mike -> 4,pat
        TreeNode joe = tree.addChild(3, "joe");
        TreeNode mike = joe.addChild(5, "mike");
        TreeNode pat = mike.addChild(4, "pat");

        // 3,joe -> 6,liz -> 18,alf -> 12,fred -> 15,con
        TreeNode liz = joe.addChild(6, "liz");
        TreeNode alf = liz.addChild(18, "alf");
        TreeNode fred = alf.addChild(12, "fred");
        TreeNode con = fred.addChild(15, "con");

        // 18,alf -> 30,bob -> 20,tim -> 24,ned -> 22,kate
        TreeNode bob = alf.addChild(30, "bob");
        TreeNode tim = bob.addChild(20, "tim");
        TreeNode ned = tim.addChild(24, "ned");
        TreeNode kate = ned.addChild(22, "kate");

        // 30,bob -> 36,sue
        TreeNode sue = bob.addChild(36, "sue");

        System.out.println(tree.toString());

        System.out.println("Input \"exit\" to end.");
        Scanner scanner = new Scanner(System.in);
        do {
            System.out.println("Please input a name.");
            System.out.print(">>");
            String name = scanner.next();
            if (name.equalsIgnoreCase("exit")) {
                break;
            }
            TreeNode result = tree.hasChild(name);
            if (result == null) {
                System.out
                        .println(String
                                .format("The tree node name \"%s\" do not in the tree. ",
                                        name));
            } else {
                System.out.println(String.format(
                        "The tree node name \"%s\" id is %d.", name,
                        result.getId()));
            }
        } while (true);
    }

}

 

    当时这个实现应该是满足的要求,但不知道面试就没有了后话,我觉得可能我实现的方法有些笨拙。今天想起来,还是记录一下。以后有新的想法再更新之。

  • 大小: 10.1 KB
  • 大小: 13.8 KB
   发表时间:2011-10-14  
像是二叉树啊
0 请登录后投票
   发表时间:2011-10-14  
全都放到map里就可了。
0 请登录后投票
   发表时间:2011-10-14  
你的代码没仔细看,就是那个图,没看明白,要是构建这样的一个图呢,还是依照图的规律,可以任意添加呢!?
0 请登录后投票
   发表时间:2011-10-14  
freezing 写道
你的代码没仔细看,就是那个图,没看明白,要是构建这样的一个图呢,还是依照图的规律,可以任意添加呢!?


原图是这样的,按题目要求是可以任意增加节点的:


  • 大小: 10.1 KB
0 请登录后投票
   发表时间:2011-10-15  
这不就是一个二叉树吗   id小的放左边 大的放左边  比普通节点多了个namen属性
0 请登录后投票
   发表时间:2011-10-16  
楼主可能没有理解腾讯考这道题的一个目的,这道题应该是要考你设计模式的,这道题可以用到《组合模式》,
而楼主的代码里面没有体现这一思想
0 请登录后投票
   发表时间:2011-10-16  
楼主可能会想读一下这个 http://en.wikipedia.org/wiki/Red–black_tree
其实直接用java.util.TreeMap<Integer, String>就足以完成题目要的功能。
0 请登录后投票
   发表时间:2011-10-16  
hanwangkun 写道
楼主可能没有理解腾讯考这道题的一个目的,这道题应该是要考你设计模式的,这道题可以用到《组合模式》,
而楼主的代码里面没有体现这一思想


不太明白,愿闻其详
0 请登录后投票
   发表时间:2011-10-16  
dsjt 写道
hanwangkun 写道
楼主可能没有理解腾讯考这道题的一个目的,这道题应该是要考你设计模式的,这道题可以用到《组合模式》,
而楼主的代码里面没有体现这一思想


不太明白,愿闻其详



那你看下《组合模式》就知道这道题很容易了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics