java 数据结构 树

本文详细介绍了树数据结构的概念、特点以及在Java中如何实现。内容包括树的定义、结点类型、树的层次、结点的关系,以及二叉树的特性如满二叉树和完全二叉树。此外,还讲解了插入、查询和删除操作的实现思想,以及四种常见的遍历方法:前序、中序、后序和层序遍历。
摘要由CSDN通过智能技术生成

树是我们计算机中非常重要的一种数据结构,同时使用树这种数据结构,可以描述现实生活中的很多事物,例如家
谱、单位的组织架构、等等。
树是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就
是说它是根朝上,而叶朝下的。
在这里插入图片描述
树具有以下特点:
1.每个结点有零个或多个子结点;
2.没有父结点的结点为根结点;
3.每一个非根结点只有一个父结点;
4.每个结点及其后代结点整体上可以看做是一棵树,称为当前结点的父结点的一个子树;
结点的度:
一个结点含有的子树的个数称为该结点的度;
叶结点:
度为0的结点称为叶结点,也可以叫做终端结点
分支结点:
度不为0的结点称为分支结点,也可以叫做非终端结点
结点的层次:
从根结点开始,根结点的层次为1,根的直接后继层次为2,以此类推
结点的层序编号:
结点的度:
一个结点含有的子树的个数称为该结点的度;
叶结点:
度为0的结点称为叶结点,也可以叫做终端结点
分支结点:
度不为0的结点称为分支结点,也可以叫做非终端结点
结点的层次:
从根结点开始,根结点的层次为1,根的直接后继层次为2,以此类推
结点的层序编号:
在这里插入图片描述
孩子结点:
一个结点的直接后继结点称为该结点的孩子结点
双亲结点(父结点)
一个结点的直接前驱称为该结点的双亲结点
兄弟结点:
同一双亲结点的孩子结点间互称兄弟结点

二叉树就是度不超过2的树(每个结点最多有两个子结点)
在这里插入图片描述
满二叉树:
一个二叉树,如果每一个层的结点树都达到最大值,则这个二叉树就是满二叉树。
在这里插入图片描述

完全二叉树
叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树
在这里插入图片描述
插入方法put实现思想
1.如果当前树中没有任何一个结点,则直接把新结点当做根结点使用
2.如果当前树不为空,则从根结点开始:
2.1如果新结点的key小于当前结点的key,则继续找当前结点的左子结点;
2.2如果新结点的key大于当前结点的key,则继续找当前结点的右子结点;
2.3如果新结点的key等于当前结点的key,则树中已经存在这样的结点,替换该结点的value值即可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查询方法get实现思想:
从根节点开始:
1.如果要查询的key小于当前结点的key,则继续找当前结点的左子结点;
2.如果要查询的key大于当前结点的key,则继续找当前结点的右子结点;
3.如果要查询的key等于当前结点的key,则树中返回当前结点的value。
删除方法delete实现思想:
1.找到被删除结点;
2.找到被删除结点右子树中的最小结点minNode
3.删除右子树中的最小结点
4.让被删除结点的左子树称为最小结点minNode的左子树,让被删除结点的右子树称为最小结点minNode的右子

5.让被删除结点的父节点指向最小结点minNode
在这里插入图片描述
在这里插入图片描述
1.前序遍历;
先访问根结点,然后再访问左子树,最后访问右子树
2.中序遍历;
先访问左子树,中间访问根节点,最后访问右子树
3.后序遍历;
先访问左子树,再访问右子树,最后访问根节点
4.层序遍历
所谓的层序遍历,就是从根节点(第一层)开始,依次向下,获取每一层所有结点的值,有二叉树如下
在这里插入图片描述
层序遍历的结果是:EBGADFHC

package cn.itcast.algorithm.tree;

import cn.itcast.algorithm.linear.Queue;

/**
 * 二叉查找树
 * @param <Key>
 * @param <Value>
 */
public class BinaryTree<Key extends Comparable<Key>, Value> {
   
    //记录根结点
    private Node root;
    //记录树中元素的个数
    private int N;

    private class Node {
   
        //存储键
        public Key key;
        //存储值
        private Value value;
        //记录左子结点
        public Node left;
        //记录右子结点
        public Node right;

        public Node(Key key, Value value, Node left, Node right) {
   
            this.key = key;
            this.value = value;
            this.left = left;
            this.right = right;
        }
    }

    //获取树中元素的个数
    public int size() {
   
        return N;
    }

    //向树中添加元素key-value
    public void put(Key key, Value value) {
   
        root = put(root, key, value);
    }

    //向指定的树x中添加key-value,并返回添加元素后新的树
    private Node put(Node x, Key key, Value value) {
   
        //如果x子树为空,
        if (x==null){
   
            N++;
            return new Node(key,value, null,
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是一种非线性的数据结构,它由若干个节点组成,这些节点之间存在一对多的关系。的一个特点是,的任意两个节点之间都存在唯一的路径。 的基本组成部分有根节点、子节点、父节点、叶节点和兄弟节点。根节点是的顶端节点,它没有父节点,其他所有节点都由一个或多个子节点连接起来。叶节点是没有子节点的节点,它是的末端。兄弟节点是具有相同父节点的节点。 的高度是从根节点到最远叶节点的路径上所经过的边的数量。的深度是从根节点到当前节点的路径上所经过的边的数量。的层次是根节点为第一层,子节点为第二层,以此类推。 用非常广泛。在计算机科学中,被广泛用于表示有层次关系的数据结构,例如文件系统、网络拓扑结构和XML文档等。常见的的变种包括二叉和平衡二叉。二叉每个节点最多有两个子节点,平衡二叉是指在插入和删除操作后能够自动调整节点位置,使得保持相对平衡。 Java中对的操作和表示有多种方式。可以使用Java集合框架中的TreeSet和TreeMap来实现树结构。此外,Java还提供了专门用于表示和操作数据结构类,例如TreeNode和TreeMap。开发人员也可以根据实际需求自定义数据结构和操作方法。 总之,是一种非线性的数据结构,具有层次结构,并且的节点之间存在一对多的关系。它在计算机科学中有广泛的用,例如表示文件系统和网络拓扑结构。在Java中,可以使用集合框架中的TreeSet和TreeMap来实现树结构,也可以自定义数据结构和操作方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值