记得不久以前有道面试题,要求下面的数据结构
里面每一项都是一个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);
}
}
当时这个实现应该是满足的要求,但不知道面试就没有了后话,我觉得可能我实现的方法有些笨拙。今天想起来,还是记录一下。以后有新的想法再更新之。
- 大小: 13.8 KB
- 大小: 10.1 KB
分享到:
相关推荐
算法面试题目录是整个知识库的核心部分,涵盖了二十多个算法面试题,涉及到爬楼梯、移动零、树的遍历、验证二叉搜索树、二进制/位运算相关、颜色分类/荷兰三色旗问题、零钱兑换、解码方法/数字字符串解码成字母的...
程序员面试题精选100题 本资源是程序员面试题精选100题,涵盖了算法、数据结构、操作系统、计算机网络、数据库等多个领域。今天,我们将深入分析其中的一道题目,即将二元查找树转换成排序的双向链表。 知识点一:...
通过"Daily-Interview-Question-master"这个压缩包文件,你可以每天挑战一个面试题,逐步提升你的JavaScript技能,为进入大厂做好充分准备。同时,这也可以作为日常学习和自我检测的工具,帮助你在实践中巩固理论...
1. **快手.js**:这可能是一道关于快手App特定功能或技术问题的手写代码实现。例如,可能要求实现一个短视频播放器的控制逻辑,或者是一段处理用户上传图片和视频的代码。也可能涉及到性能优化,如图片懒加载或视频...
从一道面试题深入探讨Linux下fork的运行机制 在Linux操作系统中,`fork()`系统调用是进程管理的核心功能之一,它允许一个已存在的进程创建一个新的进程,即子进程。子进程几乎完全复制父进程的状态,包括内存映像、...
本文的描述为空,但通过标签和部分内容可以了解到这是一道关于Transformer的面试题,该题目考察了候选人的数据结构转换能力。 标签解读 前端工程师面试,表明本文是关于前端开发领域的面试题。 部分内容解读 本文...
本文档概述了程序员面试题精选100题,涵盖了C++面试题和笔试题,其中有一道典型的题目是将二元查找树转换成排序的双向链表。 知识点一:二元查找树(Binary Search Tree) * 二元查找树是一种特殊的树数据结构,它...
提供的压缩包文件中包含的是微软等名企的数据结构与算法面试题,分为不同版本,覆盖了100道题目,可以按照版本号逐步学习和解题。例如: 1. **[答案修正]精选微软数据结构+算法面试100题[V0.2版,前20题].pdf** - ...
【程序员面试题精选100题【数据结构 /算法】】是针对求职程序员精心挑选的一系列面试题目,涵盖了数据结构和算法两大核心领域。这些题目旨在帮助应聘者提高面试技巧,提升对技术的理解,以便在激烈的就业市场竞争中...
1. **烧绳计时**:这是一道时间计算题。要计时一个小时十五分钟,可以使用三根绳子。首先点燃第一根绳子的两端,它会在30分钟后烧完;接着在第一根绳子烧完后立即点燃第二根绳子的另一端,这样第二根绳子会在45分钟...
【程序员面试题精选100题】文档涵盖了各种程序员面试中常见的技术问题,旨在帮助求职者更好地准备面试,提高成功获得理想工作的概率。面试作为筛选人才的重要环节,其重要性不言而喻,尤其在竞争激烈的IT行业中。...
- 这是一道统计问题,可以通过一次遍历来统计每个元素出现的次数,然后依次将结果写入下一行。 7. **判断链表是否相交** - 对于无环链表,可以分别遍历两个链表到尾部,记录它们的长度,然后从长度较短的链表头部...
本题是一道典型的算法面试题,考察求职者对数据结构的理解以及解决问题的逻辑思维能力。题目要求不新增任何节点的情况下,将给定的二叉查找树转化为一个排序的双向链表。 **二叉查找树的特性**:二叉查找树是一种...
【程序员经典面试题集合】 面试是评估程序员技能和知识的重要环节,这些题目涵盖了基础概念、设计模式、语言特性以及实际问题解决能力等多个方面。以下是一些经典的面试题及其解析: 1. **访问修饰符的理解** - `...
本题是针对程序员面试场景设计的一道经典题目,主要考察应聘者对数据结构和算法的理解能力。 #### 问题描述 给定一棵二叉查找树(Binary Search Tree, BST),要求不创建新的节点,仅通过调整现有节点之间的指针...