数据结构学习笔记之二
注:参考阅读书籍为数据结构-严蔚敏编著 2011/11/29 下午
第六章:树和二叉树
一、树的定义和基本操作
1、树的特点
树是一个结点n的有限集,在任意一颗树非空树中:1、有且只有一个根结点,2、当n>1时,其余结点分为m(m>0)个互不相交的有限集,其中每个集合本身又是一棵树,叫做根的子树。
关键词组:有限集、唯一性、对称性、递归性。
基本术语:结点、度、叶子、分支结点、孩子、双亲、兄弟、层次以及深度等。
基本操作:构造初始化树、取得左子树或右子树、插入结点、删除结点、树的遍历等等。
2、线性结构VS树结构
线性结构是一个“序列”,元素之间存在的是“一对一”的关系,而树是一个层次结构,元素之间存在的是“一对多”的关系。
二、二叉树的定义
1、二叉树的特点
每个结点至多只有二棵子树(即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能颠倒。
关键词组:对称、次序
2、二叉树的具体实例
满二叉树、完全二叉树、平衡二叉树等,具体区别参考书籍教材详解。
3、二叉树的存储结构
主要分为两种方式,一类是顺序结构(可使用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素),另外一类是链式存储结构,这两种存储方式各有利弊,具体要看实际操作的场合。
4、二叉树的遍历方式
遍历方案有先序遍历、中序遍历、后序遍历,具体的算法实现有递归的算法和非递归的算法。二叉树线索化初步了解,待有需要再进一步编码实战。
三、树的应用实例
1、树和森林
树的存储表示方式主要有三种:双亲表示法、孩子表示法以及孩子兄弟法。树和森林之间的相互转换也比较简单,不过多分析。
2、树的应用
(1)树的等价问题:离散数学中引入的等价和等价类的概念
(2)赫夫曼树及其应用(赫夫曼树又叫最优二叉树)
(3)回溯法与树的遍历
(4)树的计数
四、代码实战参考题目
1、构造/初始化一颗二叉树
2、递归/非递归中序遍历该二叉树
3、二叉树和森林的相互转换模拟实现 //具体看存储的方式,比如孩子兄弟法
4、对平衡二叉树进行增加、删除结点操作
补充:参考学习资料:
http://justsee.iteye.com/blog/1106693赫夫树、赫夫曼编码实现
学习代码如下:
import java.util.Stack;
/**
* @author Administrator
*
* @description 二叉树类
* @history
*/
public class BinaryTree {
/**
* 根节点root
*/
private Node root;
/**
*@description 获取根节点方法
*@return 返回根节点
*/
public Node getRoot() {
return root;
}
/**
*@description 结点参数的构造方法
*@param node
*/
public BinaryTree(Node node){
this.root = node;
}
/**
* @description 构造/初始化二叉树结点
* @return
*/
public static Node initTree() {
// 初始化五个结点A-E
Node aNode = new Node('A');
Node bNode = new Node('B');
Node cNode = new Node('C');
Node dNode = new Node('D');
Node eNode = new Node('E');
// 设置左右子结点关系
aNode.setLeft(bNode);
aNode.setRight(cNode);
bNode.setLeft(dNode);
bNode.setRight(eNode);
// 返回根节点aNode
return aNode;
}
/**
* @description 递归算法中序遍历二叉树
* @param node
*/
public void diguiInOrder(Node root) {
if (root != null) {
// 递归左子树
diguiInOrder(root.getLeft());
// 打印出当前结点value
System.out.print(root.getValue()+" ");
// 递归右子树
diguiInOrder(root.getRight());
}
}
/**
* @description 采用栈实现中序遍历二叉树
* @param root
*/
public void stackInOrder(Node root) {
if (root == null) return; // 返回不处理
// 采用单个栈的实现方法,多栈实现有空再学习
Stack<Node> stack = new Stack<Node>();
Node node = root;
// 根结点入栈、循环条件为stack不为空
stack.push(node);
while (!stack.empty()) {
// 入栈操作、一直遍历到最左边那个结点
while (node.getLeft() != null) {
stack.push(node.getLeft());
node = node.getLeft();
}
// 退栈操作、遍历退栈当前结点的右子树
if (!stack.empty()) {
node = stack.pop();
System.out.print(node.getValue()+" ");
// 如果当前退栈结点右子树不为null,入栈右结点
if (node.getRight() != null) {
stack.push(node.getRight());
node = node.getRight(); // 设置node为右结点
}
}
}
}
/**
* @description
* @param args
*/
public static void main(String[] args) {
// 构造初始化二叉树、递归算法实现中序遍历
Node root = initTree();
BinaryTree bt = new BinaryTree(root);
bt.diguiInOrder(root); // D B E A C
// 非递归算法中序遍历
bt.stackInOrder(root);
}
/**
* @description 结点类、静态内部类
* @history
*/
private static class Node {
private char value;
private Node left;
private Node right;
/**
*@description value参数构造方法
*/
public Node(char value){
this.value = value;
}
/**
*@description getter、setter方法实现
*@return
*/
public Node getLeft() {
return left;
}
public char getValue() {
return value;
}
public void setValue(char value) {
this.value = value;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
}
}
分享到:
相关推荐
数据结构学习笔记基数排序 详细讲解数据结构学习笔记基数排序 详细讲解数据结构学习笔记基数排序 详细讲解数据结构学习笔记基数排序 详细讲解数据结构学习笔记基数排序 详细讲解数据结构学习笔记基数排序 详细讲解...
数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数...
### Java数据结构学习笔记知识点详解 #### 一、数据结构与算法基础 1. **数据结构定义** - 数据结构是一门研究组织数据方式的学科,它与编程语言紧密相关,是实现高效程序设计的基础。 - 在软件开发中,合理选择...
数据结构(C语言描述)学习笔记、学习文档 数据结构(C语言描述)学习笔记、学习文档 数据结构(C语言描述)学习笔记、学习文档 数据结构(C语言描述)学习笔记、学习文档 数据结构(C语言描述)学习笔记、学习文档 ...
这本"算法与数据结构学习笔记"涵盖了这两个核心概念的详细讲解,对于任何想要深入理解计算机科学原理、提高编程技能的人来说,都是一份宝贵的资源。 算法,简单来说,就是解决特定问题的步骤或指令集。它在计算机...
### Java数据结构与算法学习笔记知识点总结 #### 一、数据结构概述 数据结构是对数据的一种组织形式,它决定了数据的存储方式以及处理数据的方法。常见的数据结构包括但不限于数组、链表、栈、队列、二叉树、图等...
2. **线性数据结构**:线性数据结构如数组、链表、栈和队列是学习的基础。笔记可能详细讲解了数组的连续存储和随机访问特性,链表的动态内存分配和指针操作,栈的“后进先出”(LIFO)原则,以及队列的“先进先出”...
"数据结构学习笔记" 本文档是一个关于数据结构学习笔记,涵盖了数据结构的基本概念、逻辑结构、物理结构、算法设计规范、算法时间复杂度分析、空间复杂度分析等方面的内容。下面是对每个知识点的详细解释: 一、...
2024数据结构——学习笔记——入门必看【建议收藏】2024数据结构——学习笔记——入门必看【建议收藏】2024数据结构——学习笔记——入门必看【建议收藏】2024数据结构——学习笔记——入门必看【建议收藏】2024数据...
数据结构与算法分析学习笔记数据结构与算法分析学习笔记数据结构与算法分析学习笔记数据结构与算法分析学习笔记数据结构与算法分析学习笔记
这里提到的《严蔚敏-数据结构视频学习笔记》就是基于严蔚敏教授的视频教程整理而成的学习笔记,这个笔记的特点是内容全面详细,可以帮助学习者在不观看视频的情况下直接学习这门课程。 数据结构的核心内容大致可以...
数据结构学习笔记.docx
这份“数据结构和算法学习笔记(经典)”的PDF文档很可能包含了丰富的理论与实践内容,旨在帮助读者掌握这些关键概念。 1. **数据结构**:数据结构是指在计算机中组织和存储数据的方式,它决定了数据的操作效率和...
本笔记主要针对初学者和准备考研或期末复习的学生,以C语言为实现语言,旨在帮助读者理解数据结构的核心概念,并提供实践案例。 首先,数据结构研究的是数据元素之间的关系及其操作。数据是信息的基础,是计算机...
数据结构的学习笔记,对初学数据结构的读者有很好的帮助。
### 数据结构高分笔记知识点详解 #### 一、引言 ...通过上述分析,《数据结构高分笔记》不仅是一本详尽的数据结构学习指南,也是帮助考生高效备考的宝贵资源。希望每位读者都能从中受益,顺利通过考试。
数据结构学习资料分享 内容概览: 本次分享包涵了大学计算机相关专业必学的“数据结构”课程的一系列学习资料。主要包括: 算法代码:我们提供了多种数据结构的实现代码,包括数组、链表、栈、队列、树、图等。...
总之,这份资料为准备考研的同学提供了一个全面的数据结构学习资源,通过笔记和习题的结合,有助于考生在考试中取得优异成绩。在复习过程中,考生应注重理论与实践的结合,不断思考和练习,才能真正掌握数据结构的...