锁定老帖子 主题:一道关于树的面试题
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-13
最后修改:2011-10-14
记得不久以前有道面试题,要求下面的数据结构
我当时是用一个树结构来实现的,代码如下: 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); } }
当时这个实现应该是满足的要求,但不知道面试就没有了后话,我觉得可能我实现的方法有些笨拙。今天想起来,还是记录一下。以后有新的想法再更新之。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-10-14
像是二叉树啊
|
|
返回顶楼 | |
发表时间:2011-10-14
全都放到map里就可了。
|
|
返回顶楼 | |
发表时间:2011-10-14
你的代码没仔细看,就是那个图,没看明白,要是构建这样的一个图呢,还是依照图的规律,可以任意添加呢!?
|
|
返回顶楼 | |
发表时间:2011-10-14
freezing 写道 你的代码没仔细看,就是那个图,没看明白,要是构建这样的一个图呢,还是依照图的规律,可以任意添加呢!?
原图是这样的,按题目要求是可以任意增加节点的: |
|
返回顶楼 | |
发表时间:2011-10-15
这不就是一个二叉树吗 id小的放左边 大的放左边 比普通节点多了个namen属性
|
|
返回顶楼 | |
发表时间:2011-10-16
楼主可能没有理解腾讯考这道题的一个目的,这道题应该是要考你设计模式的,这道题可以用到《组合模式》,
而楼主的代码里面没有体现这一思想 |
|
返回顶楼 | |
发表时间:2011-10-16
楼主可能会想读一下这个 http://en.wikipedia.org/wiki/Red–black_tree
其实直接用java.util.TreeMap<Integer, String>就足以完成题目要的功能。 |
|
返回顶楼 | |
发表时间:2011-10-16
hanwangkun 写道 楼主可能没有理解腾讯考这道题的一个目的,这道题应该是要考你设计模式的,这道题可以用到《组合模式》,
而楼主的代码里面没有体现这一思想 不太明白,愿闻其详 |
|
返回顶楼 | |
发表时间:2011-10-16
dsjt 写道 hanwangkun 写道 楼主可能没有理解腾讯考这道题的一个目的,这道题应该是要考你设计模式的,这道题可以用到《组合模式》,
而楼主的代码里面没有体现这一思想 不太明白,愿闻其详 那你看下《组合模式》就知道这道题很容易了 |
|
返回顶楼 | |