一、概述

1.以二叉树为例熟悉树形结构,二叉树的定义如下:

1.1.二叉树:是结点有限的集合,这个集合或者是空,或者由一个根结点或两棵互不相交的称为左子树和右子树的二叉树组成。

二叉树是一个递归的定义,从中可以推导出另外两个定义,完全二叉树和满二叉树,分别如下:

1.2.满二叉树:2^k-1个结点的深度为K的二叉树。

1.3. 完全二叉树:树的结点对应于相同深度的满二叉树,可称为完全二叉树。

2.二叉树的基本操作:

建树/初始化:将树置空;

求根结点;

求父节点;

求孩子结点;

求兄弟子树;

插入子树;

删除子树;

遍历;

二、链式存储的二叉树的基本操作以及算法实现

因为顺序存储只适用于满二叉树,如果存储完全二叉树,会造成空间的大量浪费,比如最坏情况下,k度的完全二叉树每个节点只有左子树存在,这样将有2^k-k-1个节点存储空值。所以选用链表存储二叉树更合适。

树的链式存储结构可抽象出来,Java语言描述如下:

public class TreeNode{

int data;

TreeNode leftNode;

TreeNode rightNode;

public TreeNode(){

}

public TreeNode(int data){

this.data = data;

this.leftNode = null;

this.rightNode = null;

}

public TreeNode(int data,TreeNode leftNode,TreeNode rightNode){

this.data = data;

this.leftNode = leftNode;

this.rightNode = rightNode;

}

}

//实现二叉链表结构,建立二叉树

public TreeNode createTree(){

int data[] = {1,2,0,0,3,4,5,0,6,7,8,0,0,9};

TreeNode tree;

for(int i = 0; i

tree = new TreeNode(data[i]);

tree.leftNode = createTree();

tree.rightNode = createTree();

}

return tree;

}

2.1.二叉树的遍历操作

如果遵循先左后右的规则,那么二叉树的遍历方法可分为三种:先根序遍历;中根序遍历;后根序遍历。

//先根序的递归方法遍历

public void disp(TreeNode tree){

if(tree != null){

System.out.print(tree.data);

disp(tree.leftNode);

disp(tree.rightNode);

}

}

//中根序的递归方法遍历

public void disp(TreeNode tree){

if(tree != null){

disp(tree.leftNode);

System.out.print(tree.data);

disp(tree.rightNode);

}

}

//后根序的递归方法遍历

public void disp(TreeNode tree){

if(tree != null){

disp(tree.rightNode);

System.out.print(tree.data+" ");

disp(tree.leftNode);

}

}

这里可以借助栈的作用将此递归方法的遍历算法改为非递归方法,降低其时间复杂度,以先根序遍历算法为例,其基本思路为:从根结点走向左子树之前,将根结点的指针入栈保存,遍历完左子树之后,在将根结点指针出栈,得到根结点地址之后走向右结点,然后遍历右子树。

//建立栈用来保存根结点指针

public class Stack{

public final int MAXSIZE= 100;

public int elem[] ;

public int top;

public Stack(){

this.top = 0;

this.elem = new int[maxsize];

}

}

//遍历算法

public void disp(TreeNode tree){

Stack stack = new Stack();

final int MAXSIZE = stack.MAXSIZE;

do{

while(tree != null){

System.out.print(tree.data+" ");

if(stack.top==MAXSIZE){

System.out.print("stack is overflow");

return;

}

stack.push( tree);

tree = tree.leftNode;

}

if(stack.top != 0){

//取出跟指针并移向右子树

tree =stack.pop().rightNode;

}

}while(stack.top != 0|| tree != null);//栈非空或子树非空

}

java 树的数据结构_Java数据结构之树(二叉树)相关推荐

  1. java 结构数据结构_Java 数据结构

    Java 数据结构 Java工具包提供了强大的数据结构.在Java中的数据结构主要包括以下几种接口和类: 枚举(Enumeration) 位集合(BitSet) 向量(Vector) 栈(Stack) ...

  2. java vector内存结构_Java 数据结构

    Java工具包提供了强大的数据结构.在Java中的数据结构主要包括以下几种接口和类: 枚举(Enumeration) 位集合(BitSet) 向量(Vector) 栈(Stack) 字典(Dictio ...

  3. java 二维链表_Java数据结构与算法----数组与链表

    数据类型 1 数据类型介绍 数据类型的分类(按照结构划分):线性结构和非线性结构 线性结构:线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 线性结构有两种不同的存储结构,即顺序 ...

  4. java 线性表定义_Java数据结构的线性表是怎样的

    Java数据结构--线性表的顺序存储实现 一.描述 线性结构特点: (1)存在唯一的一个被称作"第一个"的数据元素 (2)存在唯一的一个被称作"最后一个"的数据 ...

  5. java快排原理_Java数据结构与算法——快速排序

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇文章介绍排序算法中最常用也是面试中最容易考到的排序算法--快排,包括快排的思 ...

  6. java链表的数据结构_Java数据结构 获取链表(LinkedList)的第一个和最后一个元素

    Java数据结构 获取链表(LinkedList)的第一个和最后一个元素 以下实例演示了如何使用 LinkedList 类的 linkedlistname.getFirst() 和 linkedlis ...

  7. java循环的概念_Java数据结构之循环队列简单定义与用法示例

    本文实例讲述了Java数据结构之循环队列简单定义与用法.分享给大家供大家参考,具体如下: 一.概述: 1.原理: 与普通队列的区别在于循环队列添加数据时,如果其有效数据end == maxSize - ...

  8. java遍历树结构数据_Java数据结构——二叉树的遍历(汇总)

    二叉树的遍历分为深度优先遍历(DFS)和广度优先遍历(BFS) DFS遍历主要有: 前序遍历 中序遍历 后序遍历 一.递归实现DFS Node.java: public class Node { pr ...

  9. java 数据结构_Java数据结构学习方法

    Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? 数据结构: Data_Structure,它是储存数据的一种结构体,在此结构中储存一些数据,而这些数据之间有一定的关系. 而各数据元 ...

最新文章

  1. fasterrcnn深度学习口罩检测
  2. sybase 数据导入mysql_Windows环境下Sybase12.5 数据库创建与导入数据库.docx
  3. 软件级负载均衡器(LVS/HAProxy/Nginx)的特点简介和对比
  4. 不确定大小的数组_原来数组是容器喔
  5. 知识图谱(五)——实体消歧
  6. 计算机一级access考试题库,‎App Store 上的“计算机二级access-全国计算机等级考试题库”...
  7. 二十二、statsmodels库的使用
  8. [JAVA毕业设计]Web企业差旅在线管理系统源码获取和系统演示
  9. C语言构建连连看游戏(矩阵方式)
  10. 常用链接cg 和game
  11. CSS3 3d立方体/多棱柱-
  12. 计算机右边键盘数字无效,巧妙解决电脑键盘右边的数字键失灵问题
  13. 32、T5L 迪文屏 C51开发之数据存储模型
  14. 智能管家App kotlin版(2)——工具类封装与首页引导页开发
  15. 纽约州立大学石溪分校肖可瓅:数据驱动的金融研究
  16. 【软件工程】课程管理系统需求分析规格说明
  17. 双硬盘SSD+HDD安装双系统win10+Ubuntu16.04
  18. 相关性 与 相干性 那些事
  19. CTYZ的树论赛(P5557 旅行/P5558 心上秋/P5559 失昼城的守星使)
  20. CRMEB去除版权信息教程

热门文章

  1. 「深入浅出」主流前端框架更新批处理方式
  2. Medusa 又一个 Shopify 的开源替代品!
  3. 库克“一语成谶”:又有 30 万台安卓设备被“感染”了!| 文末福利
  4. VMware连续三年获评Gartner广域网边缘基础设施魔力象限领导者
  5. 2019年中国IaaS公有云市场排名及份额出炉
  6. 多场景下的AI疫情防控“天网”:解读云边端联动下的全栈 AI 技术
  7. 云+X案例展 | 民生类:基于AWS PaaS构建基础集团企业级中台
  8. 看完这篇买车不用坐引擎盖哭啦
  9. pip 安装_安装 pip 轻松管理 PyPI 软件包 | Linux 中国
  10. php与python缺点_php和python的比较