一.什么是树结构?

树(Tree)结构是一种描述非线性层次关系的数据结构。树是n个数据结点的集合,在该集合中包含一个根结点,根结点下分布着一些互不交叉的子集合,这些子集合是根结点的子树。

树结构的基本特征如下:

在一个树结构中,有且仅有一个结点没有直接前驱,这个结点就是树的根结点。

除根结点外,其余每个结点有且仅有一个直接前驱。

每个结点可以有任意多个直接后继。

一个树结构也可以是空,空树没有数据结点,也就是一个空集合。

如果树结构中仅包含一个结点,那么这也是一个树,树根便是该结点自身。

二.树的基本概念

1.父结点和子结点:一个节点含有的子树的根节点称为该节点的子节点,相应的,该结点称为其子结点的父结点。

2.兄弟结点:具有同一父结点的子结点。

3.结点的度:一个节点所包含子树的数量。

4.树的度:是该树所有结点中最大的度。

5.叶结点:树中度为零的结点称为叶结点或终端结点。

6.分支结点:树中度不为0的结点称为分支结点或非终端结点。

7.结点的层数:结点的层数从树根开始计算,根结点为第1层,依次向下为第2、3、......、n层(树是一种层次结构,每个结点都处在一定层次上)。

8.树的深度:树中结点的最大层数称为树的深度。

9.有序树:若树中各结点的子树(兄弟结点)是按一定次序从左向右排列的,称为有序树。

10.无序树:若树中各结点的子树(兄弟结点)未按一定次序排列,称为无序树。

11.森林(forest):n(n>0)棵互不相交的树的集合。

三.二叉树

1.什么是二叉树?

二叉树是数据结构的一种特殊形式,它是n个结点的结合,每个结点最多只能有两个子结点。二叉树的子树仍然是二叉树。二叉树的一个结点上对应的两个子树分别称为左子树和右子树。由于子树有左右之分,因此二叉树是有序树。

二叉树结点的最大度是2。

二叉树有左右子树的区别。

2.特殊的二叉树

(1)满二叉树

满二叉树即在二叉树中除最下一层的叶结点外,每层的结点都有两个子结点。而且结点总数为:2^n-1。n是树的高度。

(2)完全二叉树

完全二叉树即在除二叉树最后一层外,其他各层的结点树都达到最大个数,且最后一层叶结点按照从左向右的顺序连续存在,只缺最后一层右侧若干结点。

若树中包含n个结点,对于任意一个结点m来说,有如下性质:

如果m!=1,则结点m的父结点的编号为m/2;

如果2*m<=n,则结点m的左子树根结点的编号为2*m;若2*m+1>n,则无左子树,也没有右子树;

如果2*m+1<=n,则结点m的右子树根结点编号为2*m+1;若2*m+1>n,则无右子树。

对于该完全二叉树来说,其深度为[log2n]+1。

满二叉树一定是完全二叉树,而完全二叉树不一定是满二叉树。

3.二叉树的顺序存储

树结构的顺序存储一般采用一维结构数组来表示。

由于非完全二叉树,需要将缺少的部分填充为空,顺序存储填充了大量无用数据,且浪费存储空间。

因此顺序存储的二叉树通常情况只考虑完全二叉树。

第n个元素的左子结点是2*n+1

第n个元素的右子结点是2*n+2

第n个元素的父结点是(n-1)/2

(1)二叉树抽象类

package cn.kimtian.tree.arraybinarytree;

/**

* 顺序存储的二叉树

*

* @author kimtian

*/

public class ArrayBinaryTree {

/**

* 一个存储树的数组

*/

int[] data;

public ArrayBinaryTree(int[] data) {

this.data = data;

}

}

(2)给二叉树赋值

package cn.kimtian.tree.arraybinarytree;

/**

* 创建一个顺序存储的二叉树

*

* @author kimtian

*/

public class TestArrayBinaryTree {

public static void main(String[] args) {

int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};

ArrayBinaryTree arrayBinaryTree = new ArrayBinaryTree(a);

}

}

4.二叉树的链式存储

(1)二叉树抽象类

package cn.kimtian.tree;

/**

* 链式存储的二叉树

*

* @author kimtian

*/

public class BinaryTree {

/**

* 根结点

*/

TreeNode root;

/**

* 设置根结点

*

* @param root 根结点

*/

public void setRoot(TreeNode root) {

this.root = root;

}

/**

* 获取根结点

*

* @return TreeNode 根结点

*/

public TreeNode getRoot() {

return root;

}

}

(2)二叉树的结点

package cn.kimtian.tree;

/**

* 树里面的结点

*

* @author kimtian

*/

public class TreeNode {

/**

* 树里面的值,结点的权

*/

int value;

/**

* 左儿子

*/

TreeNode leftNode;

/**

* 右儿子

*/

TreeNode rightNode;

public TreeNode(int value) {

this.value = value;

}

public void setLeftNode(TreeNode leftNode) {

this.leftNode = leftNode;

}

public void setRightNode(TreeNode rightNode) {

this.rightNode = rightNode;

}

}

(3)给二叉树赋值

package cn.kimtian.tree;

/**

* 测试链式存储的二叉树

*

* @author kimtian

*/

public class TestBinaryTree {

public static void main(String[] args) {

//创建一棵树

BinaryTree binaryTree = new BinaryTree();

//创建一个根结点

TreeNode root = new TreeNode(1);

//将根结点赋给树

binaryTree.setRoot(root);

//创建一个子左结点

TreeNode leftTwo = new TreeNode(2);

//创建一个子右结点

TreeNode rightTwo = new TreeNode(3);

//给根的左结点赋值

root.setLeftNode(leftTwo);

//给根的右结点赋值

root.setRightNode(rightTwo);

}

}

树结构(Tree) 基础相关推荐

  1. 第 10 章 树结构的基础部分

    第 10 章 树结构的基础部分 1.二叉树 1.1.为什么需要二叉树 1.1.1.数组存储方式的分析 优点: 通过下标方式访问元素, 速度快. 对于有序数组, 还可使用二分查找提高检索速度 缺点: 如 ...

  2. 【尚硅谷】Java数据结构与算法笔记10 - 树结构的基础部分

    文章目录 一.二叉树 1.1 为什么需要树结构 1.1.1 数组存储方式的分析 1.1.2 链式存储方式的分析 1.1.3 树存储方式的分析 1.2 树示意图 1.3 二叉树的概念 1.4 二叉树 - ...

  3. java树结构Tree生成

    这篇文章介绍了如何利用Java编写树结构算法,特别是动态路由的实现.该篇文章的核心代码就是 buildTree() 方法,可以根据输入的节点集合(treeNodes)构建树形结构,并返回根节点集合(r ...

  4. PCL :K-d tree 2 结构理解

    K-d tree 基础思路:(先看之前的KNN思想,更容易理解) 导语:kd 树是一种二叉树数据结构,可以用来进行高效的 kNN 计算.kd 树算法偏于复杂,本篇将先介绍以二叉树的形式来记录和索引空间 ...

  5. linux安装tree命令

    安装 yum install -y tree 使用,比如显示/root的2层树结构 tree -L 2 /root 效果 /root ├── \033 ├── code │ └── helloworl ...

  6. linux echo写php编码,linux使用和基础操作(示例代码)

    1.linux系统初使用 linux有图形终端和字符终端,关于linux学习以字符终端为主,即命令行操作: [root@centos7 ~]#runlevel 查看当前工作模式 N 3 //3为字符终 ...

  7. 2021-06-22 hi3516ev200 按键输入 gpio_key input 驱动 device tree 设备树方式

    Linux device tree 基础知识不补充,自行查找...... root@yex-Ubuntu:/home/work/hiSDK/hi3516ev200/hi3516/linux-4.9.y ...

  8. linux中文麻酱字_【树】Linux笔记 1

    以下内容是参与[生信技能树-全球听第7期]的课程笔记,记录人:小瑛  ,有问题可在公众号后台留言 小白小白,请注意:笔记中出现的所有文件路径,仅作为参考,请勿模仿! 1. 登录服务器 1.1 Mac电 ...

  9. cmake:在各级目录之间共享变量(cmake cache变量)

    摘要: 本文记录一下 CMake 变量的定义.原理及其使用.CMake 变量包含 Normal Variables.Cache Variables.通过 set 指令可以设置两种不同的变量.也可以在 ...

最新文章

  1. Python名称空间是什么?
  2. LeetCode之Add Two Numbers
  3. App中如何实现消息推送
  4. 海量用户标签系统之存储架构设计(Bigmap算法)
  5. Huaman Gene Functions
  6. 看看MySQL几种主流备份方案的优缺点
  7. Linux基础—2.Linux中的文件基本命令以及四大远程连接工具XShell、FileZilla、Notepad++、Xmanager4的使用
  8. 关于高效找工作的几条建议
  9. js的this作用域
  10. 《炬丰科技-半导体工艺》 光学镜片和玻璃部件的超声波清洗
  11. 遥感数据下载网站汇总
  12. 如何用计算机计算社会,五险一金计算器到底该怎么用
  13. lua安装教程 linux,Linux 安装 luarocks(lua的模块管理工具)
  14. php 京东 联盟 链接,京东联盟推广链接在微信上如何直接跳转接入到京东小程序下单购买?...
  15. C语言实现 输入两个正整数m和n,求其最大公约数和最小公倍数【学习笔记】
  16. 服务器主机如何安装系统,服务器主机系统安装教程
  17. word中硬回车(enter)与软回车(shift+enter)
  18. 微软都有哪些开源项目?
  19. vue3.0 + JsBarcode 循环生成多个条形码(setup语法糖)
  20. 机器学习 最小角回归 LARS

热门文章

  1. HTTP —— HTTP 协议中的细节(超详细!!)
  2. 高德坐标与84坐标在 高德地图上的偏移
  3. 2021-05-24,2020版PS抹除海报文字方法
  4. android获取短信电话,Android:如何从收到的短信中获取电话号码?
  5. 《小明升职记》(七)
  6. Excel:如何算出重复次数。
  7. Python推特开发库tweepy基本操作:Twitter for Python
  8. 喜讯!云创大数据跻身新三板创新层!
  9. vapor 链接MySQL失败
  10. 鸿蒙系统万物互联,大有前途!华为鸿蒙系统再次确认新消息,距离万物互联更近了...