`
Sharpleo
  • 浏览: 576204 次
  • 性别: Icon_minigender_1
  • 来自: newsk
社区版块
存档分类
最新评论

java数据结构 (两叉树)

阅读更多
   树
一,为什么需要使用树?
    有序数组插入数据项和删除数据项太慢。
    链表查找数据太慢。
    在树中能非常快速的查找数据项,插入数据项和删除数据项。

二,树的结构


                                          树的基本概念
三,路径
    顺着连接节点的边从一个节点到另一个节点,所经过的节点顺序排列称为路径。

四,根
    树最上面的节点称为根节点。一棵树只有一个根。而且从根到任何节点有且只有一条路径。

五,父节点
    每个节点都有一条边向上连接到另一个节点,这个节点就称为是下面这个节点的父节点。

六,子节点
    每个节点都有一条边向下连接到另一个节点,下面的节点就是该节点的子节点。

七,叶子节点
    没有子节点的节点称为叶子节点。

八,子树
    每个节点都可以作为一个子树的根,它和它所有的子节点,子节点的子节点组合在一起就是一个子树。

九,访问
    访问一个节点是为了在这个节点上执行一些操作;如查看节点的数据项。但是如果仅仅是经过一个节点,不认为是访问了这个节点。

十,层
    一个节点的层数是指从根开始到这个节点有多少代。


                                                二叉树
一,二叉树
    树的每个节点最多只能有两个子节点的树,成为二叉树。

二,代码实现二叉树
/* 
 * 二叉树节点 
 */ 
public class Node { 
    //数据项 
    public long data; 
    //左子节点 
    public Node leftChild; 
    //右子节点 
    public Node rightChild; 
 
    /** 
     * 构造方法 
     * @param data 
     */ 
    public Node(long data) { 
        this.data = data; 
    } 
}

/* 
 * 二叉树类 
 */ 
public class Tree { 
    //根节点 
    private Node root; 
 
    /** 
     * 插入节点 
     * @param value 
     */ 
    public void insert(long value) { 
 
    } 
 
    /** 
     * 查找节点 
     * @param value 
     */ 
    public void find(long value) { 
 
    } 
 
    /** 
     * 删除节点 
     * @param value 
     */ 
    public void delte(long value) { 
 
    } 
}



      二叉树操作
一,插入节点。
    从根节点开始查找一个相应的节点,这个节点将成为新插入节点的父节点。当父节点找到后,通过判断新节点的值比父节点的值的大小来决定是连接到左子节点还是右子节点。

二,查找节点。
    从根节点开始查找,如果查找的节点值比当前节点的值小,则继续查找其左子树,否则查找其右子树。

/* 
 * 二叉树节点 
 */ 
public class Node { 
    //数据项 
    public long data; 
    //数据项 
    public String sData; 
    //左子节点 
    public Node leftChild; 
    //右子节点 
    public Node rightChild; 
 
    /** 
     * 构造方法 
     * @param data 
     */ 
    public Node(long data,String sData) { 
        this.data = data; 
        this.sData = sData; 
    } 
 
}

/* 
 * 二叉树类 
 */ 
public class Tree { 
    //根节点 
    public Node root; 
 
    /** 
     * 插入节点 
     * @param value 
     */ 
    public void insert(long value,String sValue) { 
        //封装节点 
        Node newNode = new Node(value,sValue); 
        //引用当前节点 
        Node current = root; 
        //引用父节点 
        Node parent; 
        //如果root为null,也就是第一插入的时候 
        if(root == null) { 
            root = newNode; 
            return; 
        } else { 
            while(true) { 
                //父节点指向当前节点 
                parent = current; 
                //如果当前指向的节点数据比插入的要大,则向左走 
                if(current.data > value) { 
                    current = current.leftChild; 
                    if(current == null) { 
                        parent.leftChild = newNode; 
                        return; 
                    } 
                } else { 
                    current = current.rightChild; 
                    if(current == null) { 
                        parent.rightChild = newNode; 
                        return; 
                    } 
                } 
            } 
        } 
    } 
 
    /** 
     * 查找节点 
     * @param value 
     */ 
    public Node find(long value) { 
        //引用当前节点,从根节点开始 
        Node current = root; 
        //循环,只要查找值不等于当前节点的数据项 
        while(current.data != value) { 
            //进行比较,比较查找值和当前节点的大小 
            if(current.data > value) { 
                current = current.leftChild; 
            } else { 
                current = current.rightChild; 
            } 
            //如果查找不到 
            if(current == null) { 
                return null; 
            } 
        } 
        return current; 
    } 
 
    /** 
     * 删除节点 
     * @param value 
     */ 
    public void delte(long value) { 
 
    } 
 
}

public class TestTree { 
    public static void main(String[] args) { 
        Tree tree = new Tree(); 
        tree.insert(10,"James"); 
        tree.insert(20,"YAO"); 
        tree.insert(15,"Kobi"); 
        tree.insert(3,"Mac"); 
 
        System.out.println(tree.root.data); 
        System.out.println(tree.root.rightChild.data); 
        System.out.println(tree.root.rightChild.leftChild.data); 
        System.out.println(tree.root.leftChild.data); 
 
        Node node = tree.find(3); 
        System.out.println(node.data + ", " + node.sData); 
    } 
}

分享到:
评论

相关推荐

    机械设计两叉固定机sw13可编辑非常好的设计图纸100%好用.zip

    压缩包内的子文件“2023.07月-两叉固定机sw13可编辑.zip”可能是主文件的更新版本或者不同阶段的设计文件,同样包含了使用SolidWorks 2013制作的两叉固定机的可编辑设计数据。 基于这些信息,我们可以深入讨论以下...

    机械设计两叉固定机sw13可编辑全套技术资料100%好用.zip

    机械设计两叉固定机sw13可编辑全套技术资料100%好用.zip

    浙江省07年三级数据库试题及答案

    4. 树结构:树中,两个结点如果有相同的父结点,则它们互为兄弟结点。路径的长度是路径上边的数目。 5. 最佳两叉排序树:最佳两叉排序树是最优的二叉搜索树,它的每个子树也都是最佳的,使得搜索效率最高。 6. ...

    修饰离子流在重离子碰撞中:对中等诱导的致辐射的敏感性

    我们认为,当代的喷射子结构技术可能有助于在重离子碰撞中对硬介质诱导的胶子medium致... 最后,我们提出了一个互补的可观察性,即Pb-Pb中的两叉式概率与质子-质子碰撞的比率,并讨论了其对各种能量损失机制的敏感性。

    PROFIBUS—DP现场总线在矫直机辅机自动化系统中的应用.pdf

    其中,PROFIBUS-DP因其精简的结构而保证了数据的高速传输,它特别适用于可编程控制器与现场级分散I/O设备之间的通信,以及满足交直流调速系统快速响应的时间要求。PROFIBUS-DP采用的是EIA-RS485协议,并可根据数据...

    行业资料-电子功用-具有音叉状端子狭缝宽度检查部分的电分线盒的说明分析.rar

    音叉状端子设计灵感来源于音叉的振动原理,其形状如同音叉的两叉,这种设计使得端子在接触时能形成多个接触点,有效降低了接触电阻,从而提高了电流传输的效率和稳定性。同时,音叉状结构增加了端子的机械强度,防止...

    (二)农业革命的主要农具是木石复合器参照.pdf

    例如,甲骨文中的“耒”字描绘了一种直立的叉子状工具,上端是直杆,下端分为两叉,旁边有手的形象,反映出原始农具的设计。《诗经》等古籍中也多次提到耜的使用,如《小雅·大田》中的“以我覃耜,俶载南亩,播厥...

    厂内机动车辆安全技术培训教材.pptx

    7. 货物应均匀分布在两叉之间,避免单臂承载,保持货物重心靠近叉车内部。 8. 叉车下方禁止站立人员,不得用叉车搭载人员。 四、堆垛式叉车安全规程 堆垛式叉车的安全管理同样严谨: 1. 驾驶员必须穿戴劳保用品,...

    操作系统课程设计说明书基于Linux的进程之间通信.doc

    - 解决死锁的三种方法包括限制同时取叉人数、确保两叉同时可用、按奇偶顺序取叉。 - 本设计采用的方法是:在拿叉前检查邻居状态,避免当邻居在用餐时自己尝试拿叉。 4. **软件功能** - 实现哲学家的思考、拿叉、...

    专业知识五笔输入口诀共4页.pdf.zip

    五笔输入法基于汉字的笔画结构,通过拆解字形来输入,提高了打字效率,尤其在专业领域如文秘、排版、编程等中广泛应用。以下是对五笔输入法的详细解析: 一、五笔字根基础知识 五笔字根是五笔输入法的基础,由...

    变速器换挡叉加工工艺及夹具设计

    3. **以15mm槽为基准的两叉口端面**:这些表面的精度直接影响到换挡过程中的平稳性和顺畅度。 4. **以Φ15.81孔的轴心线为基准的两叉口侧面**:这些表面也需要达到较高的加工精度。 5. **15mm槽中心的两个侧面及槽外...

    叉车危险源辨识及风险评价表.docx

    3. 货物不均匀分配在两叉之间、超载:这会破坏叉车的稳定性,可能导致翻车或其他严重事故。严格按照叉车的承载能力和货物装载规定操作,确保货物均匀分布。 4. 叉重物正向下坡行驶:在斜坡上作业时,重力可能导致...

    厂内叉车安全操作规程.pdf

    1. 叉车载物时,应调整两货叉间距,使两叉复合均衡,不得偏斜,品的一面应贴靠挡物架。 2. 禁止单叉作业或用叉订物品、拉物品或设备,严禁超叉车负荷作业。 3. 在进行物品的装卸过程中,必须用制动器制动叉车。 4. ...

    机械设备考试题.docx

    3. 用于两叉轴传动的联轴器通常选择万向联轴器,因为它能允许两轴有一定的角度偏差。 4. 离心泵的基本性能参数包括流量、扬程、必需汽蚀余量、转速、功率和效率。 5. 设备安装调试中的故障检测方法包括听、看、摸和...

    厂内车辆检验员现场实操+仪器考试要点打印.doc

    - 货叉不得有裂纹,两叉尖高度差不超过3%,磨损过度应更换。 这些知识点涵盖了厂内车辆检验员在现场操作和使用仪器进行检验时需要关注的主要方面,确保车辆的安全运行和合规性。通过深入理解和熟练掌握这些要点,...

    2021年N1叉车司机考试题库及N1叉车司机模拟考试题.docx

    检查时严禁在叉齿上停留通过、装载货物重量应均匀分配与两叉之间、堆高货物需捆绑、严禁一切人员在叉齿下停留等。 13. 柴油机进气行程中吸进的是纯空气。 14. 夜间在道路旁停车,要打开示宽灯和尾灯,防止碰撞。 ...

    叉车类设备操作规程.pdf

    货叉操作则要求操作员格外小心,比如要确保货叉负载不超过叉车的最大承载,货物应均匀分布在两叉之间,并且在垂直位置升降货叉。行驶时使用手制动以保持稳定是确保安全的重要措施。 在装卸堆垛作业中,安全规定更为...

    有机化学总实验问题.doc

    温度计应放在提勒管的两叉口中部。 3. 毛细管中的样品熔融后再冷却,不宜重复使用,因为可能会发生分解或形成新的结晶形态,影响熔点测定。 4. 重结晶时,活性炭不能在沸腾状态下加入,以防止暴沸导致溶液溢出。 ...

    内燃平衡重式叉车安全操作规程.docx

    - **负载均衡**:叉取货物时调整货叉间距,使两叉负荷均衡,确保货物平稳放置。 - **安全码放**:码垛前确认周围无人,码放时检查底层稳定性。 - **堆垛检查**:至少每日三次自查堆垛情况,发现不稳及时调整。 - **...

Global site tag (gtag.js) - Google Analytics