树结构(Java)

本文介绍了树形结构的基本概念,包括根节点、父节点、子节点和度等。详细讲解了二叉树的定义,区分了满二叉树和完全二叉树。接着探讨了二叉树的链式存储结构,包括创建、遍历、查找和删除操作。最后提到了使用数组进行顺序存储的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树结构概述

什么是树结构

树形结构是一层次的嵌套结构。 一个树形结构的外层和内层有相似的结构, 所以这种结构多可以递归的表示。经典数据结构中的各种树状图是一种典型的树形结构:一颗树可以简单的表示为根, 左子树, 右子树。 左子树和右子树又有自己的子树。

树的基本概念

在这里插入图片描述

  1. 根结点: 它是同一棵树中除本身外所有结点的祖先,没有父结点。图中根结点为1。
  2. 父节点: 结点的上层结点叫做该结点的父结点。图中10的父结点是7。
  3. 子节点: 下一层的结点均为上一层的子节点。
  4. 结点的度: 结点所拥有子结点的个数。图中5的度为2.
  5. 路径: 从根结点到访问的结点,且经过其他的结点。
  6. 叶子结点: 度为0的结点,也叫终端结点。
  7. 分支结点: 度不为0的结点,也叫非终端结点或内部结点。
  8. 结点的层次: 从根结点到树中某结点所经路径上的分支数称为该结点的层次。根结点的层次规定为1,其余结点的层次等于其双亲结点的层次加1。
  9. 树的深度: 树中结点的最大层次数。
  10. 森林: m(m≥0)棵树的集合。

二叉树

什么是二叉树

二叉树:

  • 任何一个结点的子结点数量均不超过2。
  • 二叉树的子结点分为左结点和右结点。

满二叉树

所有叶子结点都在最后一层,而且结点的的总数为:2^n-1 (n是树的高度)
在这里插入图片描述

完全二叉树

所有叶子结点都在最后一层或倒数第二层,且最后一层的叶子结点在左边连续,倒数第二节的叶子结点在右边连续
在这里插入图片描述

链式存储结构

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。

通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。其结点结构为:

在这里插入图片描述

二叉树的创建及遍历

在这里插入图片描述

public class BinaryTree {
   
   
    TreeNode root;

    //设置根结点
    public void setRoot(TreeNode root) {
   
   
        this.root = root;
    }

    //获取根结点
    public TreeNode getRoot() {
   
   
        return root;
    }

    //前序遍历
    public void frontShow(){
   
   
        if(root!null){
   
   
            root.frontShow();
        }
    }
    //中序遍历
    public void midShow(){
   
   
        if(root!=null){
   
   
            root.midShow();
        }
    }
    //后序遍历
    public void afterShow(){
   
   
        if(root!=null){
   
   
            root.afterShow();
        }
    }

public class TestBinaryTree {
   
   

    public static void main(String[] args) {
   
   
        //创建一棵树
        BinaryTree binTree = new BinaryTree();
        //创建一个根结点
        TreeNode root = new TreeNode(1);
        //把根结点赋给树
        binTree.setRoot(root);
        //创建一个左结点
$(function(){ $.fn.extend({ SimpleTree:function(options){ //初始化参数 var option = $.extend({ click:function(a){ } },options); option.tree=this; /* 在参数对象中添加对当前菜单树的引用,以便在对象中使用该菜单树 */ option._init=function(){ /* * 初始化菜单展开状态,以及分叉节点的样式 */ this.tree.find("ul ul").hide(); /* 隐藏所有子级菜单 */ this.tree.find("ul ul").prev("li").removeClass("open"); /* 移除所有子级菜单父节点的 open 样式 */ this.tree.find("ul ul[show='true']").show(); /* 显示 show 属性为 true 的子级菜单 */ this.tree.find("ul ul[show='true']").prev("li").addClass("open"); /* 添加 show 属性为 true 的子级菜单父节点的 open 样式 */ }/* option._init() End */ /* 设置所有超链接不响应单击事件 */ this.find("a").click(function(){ $(this).parent("li").click(); return false; }); /* 菜单项 接受单击 */ this.find("li").click(function(){ /* * 当单击菜单项 * 1.触发用户自定义的单击事件,将该 标签中的第一个超链接做为参数传递过去 * 2.修改当前菜单项所属的子菜单的显示状态(如果等于 true 将其设置为 false,否则将其设置为 true) * 3.重新初始化菜单 */ option.click($(this).find("a")[0]); /* 触发单击 */ /* * 如果当前节点下面包含子菜单,并且其 show 属性的值为 true,则修改其 show 属性为 false * 否则修改其 show 属性为 true */ /* if($(this).next("ul").attr("show")=="true"){ $(this).next("ul").attr("show","false"); }else{ $(this).next("ul").attr("show","true"); }*/ /* 初始化菜单 */ option._init(); }); /* 设置所有父节点样式 */ this.find("ul").prev("li").addClass("folder"); /* 设置节点“是否包含子节点”属性 */ this.find("li").find("a").attr("hasChild",false); this.find("ul").prev("li").find("a").attr("hasChild",true); /* 初始化菜单 */ option._init(); }/* SimpleTree Function End */ }); });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值