`
lettoo
  • 浏览: 35404 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
博客专栏
58ccff5b-5ca6-387a-9c99-a277f31a9e51
我和Java数据库操作的那...
浏览量:9538
社区版块
存档分类
最新评论

一道关于树的面试题

阅读更多

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




 
 
    里面每一项都是一个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
分享到:
评论
2 楼 lettoo 2011-10-17  
谢谢LS
1 楼 wywin100 2011-10-16  
我给的代码

package cn.edu.hust.chart;

import java.util.*;

public class TestTreeMap {
	public static void main(String[] args) {
		// Creat a tree map
		TreeMap tm = new TreeMap();
		// Put elements to the map
		tm.put(2, "sally");
		tm.put(3, "joe");
		tm.put(4, "pat");
		tm.put(6, "liz");
		tm.put(18, "alf");
		tm.put(12, "fred");
		tm.put(15, "con");
		tm.put(30,"bob");
		tm.put(20, "tim");
		tm.put(24, "ned");
		tm.put(22, "kate");
		tm.put(5, "mike");
		// Get a set of entries
		Set set = tm.entrySet();
		// Get an iterator
		Iterator i = set.iterator();
		// Display elements
		while (i.hasNext()) {
			Map.Entry me = (Map.Entry) i.next();
			System.out.print(me.getKey() + ": ");
			System.out.println(me.getValue());
		}
		System.out.println("please input the name: ");
		Scanner sc = new Scanner(System.in);
		String name = sc.nextLine();
		Iterator iterator =set.iterator();
		while (iterator.hasNext()) {
			Map.Entry me = (Map.Entry) iterator.next();
			if (me.getValue().equals(name)) {
				System.out.println(name + " id: " + me.getKey());
			}
		}
	}
}

相关推荐

    算法面试题实用知识库分享

    算法面试题目录是整个知识库的核心部分,涵盖了二十多个算法面试题,涉及到爬楼梯、移动零、树的遍历、验证二叉搜索树、二进制/位运算相关、颜色分类/荷兰三色旗问题、零钱兑换、解码方法/数字字符串解码成字母的...

    百度面试题大全

    【百度面试题大全】涵盖了多个IT领域的知识点,包括数据结构、算法、数据库理论以及市场营销策略。以下是这些知识点的详细说明: 1. **堆和栈的区别**:堆和栈是计算机内存管理的两种基本数据结构。栈是后进先出...

    程序员面试题精选100题

    程序员面试题精选100题 本资源是程序员面试题精选100题,涵盖了算法、数据结构、操作系统、计算机网络、数据库等多个领域。今天,我们将深入分析其中的一道题目,即将二元查找树转换成排序的双向链表。 知识点一:...

    算法面试题总结.pdf

    本文总结了五道常见的算法面试题,并对每一道题目进行了详细解答和分析,旨在帮助大家深入理解算法设计的基本原理和方法。 首先,将二元查找树转换为排序双向链表。二元查找树(BST)的性质是:对于任意节点,其左...

    工作日每天一道前端大厂面试题

    通过"Daily-Interview-Question-master"这个压缩包文件,你可以每天挑战一个面试题,逐步提升你的JavaScript技能,为进入大厂做好充分准备。同时,这也可以作为日常学习和自我检测的工具,帮助你在实践中巩固理论...

    前端面试题-手写代码实现

    1. **快手.js**:这可能是一道关于快手App特定功能或技术问题的手写代码实现。例如,可能要求实现一个短视频播放器的控制逻辑,或者是一段处理用户上传图片和视频的代码。也可能涉及到性能优化,如图片懒加载或视频...

    从一道面试题谈linux下fork的运行机制

    从一道面试题深入探讨Linux下fork的运行机制 在Linux操作系统中,`fork()`系统调用是进程管理的核心功能之一,它允许一个已存在的进程创建一个新的进程,即子进程。子进程几乎完全复制父进程的状态,包括内存映像、...

    前端大厂最新面试题-transformer.docx

    本文的描述为空,但通过标签和部分内容可以了解到这是一道关于Transformer的面试题,该题目考察了候选人的数据结构转换能力。 标签解读 前端工程师面试,表明本文是关于前端开发领域的面试题。 部分内容解读 本文...

    程序员面试题精选100题.docx

    本文档概述了程序员面试题精选100题,涵盖了C++面试题和笔试题,其中有一道典型的题目是将二元查找树转换成排序的双向链表。 知识点一:二元查找树(Binary Search Tree) * 二元查找树是一种特殊的树数据结构,它...

    各大公司程序员面试题集锦(何海涛版pdf)

    在文档中提到了一道关于数据结构变换的经典面试题——将二元查找树转换成排序的双向链表。这道题目不仅考察了对二元查找树的理解,还涉及到了链表的操作。 **题目描述:** 输入一棵二元查找树,目标是将这棵二元...

    数据结构和算法名企面试题

    提供的压缩包文件中包含的是微软等名企的数据结构与算法面试题,分为不同版本,覆盖了100道题目,可以按照版本号逐步学习和解题。例如: 1. **[答案修正]精选微软数据结构+算法面试100题[V0.2版,前20题].pdf** - ...

    程序员面试题精选100题【数据结构 /算法】

    【程序员面试题精选100题【数据结构 /算法】】是针对求职程序员精心挑选的一系列面试题目,涵盖了数据结构和算法两大核心领域。这些题目旨在帮助应聘者提高面试技巧,提升对技术的理解,以便在激烈的就业市场竞争中...

    微软面试题和答案

    1. **烧绳计时**:这是一道时间计算题。要计时一个小时十五分钟,可以使用三根绳子。首先点燃第一根绳子的两端,它会在30分钟后烧完;接着在第一根绳子烧完后立即点燃第二根绳子的另一端,这样第二根绳子会在45分钟...

    程序员面试题精选100题.doc

    【程序员面试题精选100题】文档涵盖了各种程序员面试中常见的技术问题,旨在帮助求职者更好地准备面试,提高成功获得理想工作的概率。面试作为筛选人才的重要环节,其重要性不言而喻,尤其在竞争激烈的IT行业中。...

    企业数据结构与算法面试题

    - 这是一道统计问题,可以通过一次遍历来统计每个元素出现的次数,然后依次将结果写入下一行。 7. **判断链表是否相交** - 对于无环链表,可以分别遍历两个链表到尾部,记录它们的长度,然后从长度较短的链表头部...

    程序员面试题精选100题(更新至60)

    本题是一道典型的算法面试题,考察求职者对数据结构的理解以及解决问题的逻辑思维能力。题目要求不新增任何节点的情况下,将给定的二叉查找树转化为一个排序的双向链表。 **二叉查找树的特性**:二叉查找树是一种...

    程序员经典面试题集合

    【程序员经典面试题集合】 面试是评估程序员技能和知识的重要环节,这些题目涵盖了基础概念、设计模式、语言特性以及实际问题解决能力等多个方面。以下是一些经典的面试题及其解析: 1. **访问修饰符的理解** - `...

Global site tag (gtag.js) - Google Analytics