数据结构学习系列
基本简介
数据结构是指相互之间存在着一种或者多种关系的数据元素的集合和集合
各种元素之间的关系组成.
1、线性结构:数据结构中的元素存在一对一的关系。
eg: 列表、队列、栈
2、树形结构:数据结构中的元素存在一对多的关系。
3、图形结构:数据结构中的元素存在多对多的关系。
数据的物理结构是数据在计算机中的具体表示(映像),具体实现的方法有:顺序、链表、
索引、散列等,所以,一种数据结构可以有多种存储结构。
树
1、家谱:爷爷、奶奶、爸爸、妈妈、哥哥、姐姐 就组成了树形结构。
2、公司组织结构:CEO、CTO、经理、员工等也组成了树形组织结构。
3、HTML文档:该Html标签中包含各种子标签,也是一种树形结构。
Tree(树): Nodes 的实体集合, 节点通过edges(边)连接,每个Node(节点)都
包含一个value或者data,而且它可能有child node(子节点)。
root(根节点):树的第一个节点,如果被其它节点连接,则该节点是一个父节点,而连接的节
点被称为child。如:下图 节点14
父节点:一个节点有一条边指向子节点 如:14、13、9、12、7
子节点:一个节点有一个父节点 如:13、9、12、7、3、8、0、10、6
edges(边):所有树节点之间连接的线。
leaves(叶子):一棵树的最后一个节点,没有子节点
树高:叶子节点的最长路径
节点的深度:该节点到根节点的路径长度
#
# _____14__
# / \
# ____13__ 9
# / \ / \
# 12 7 3 8
# / \ /
# 0 10 6
Binary trees(二叉树)
在计算机领域,二叉树是每个节点最多只有两个子节点,一个子节点被当作左子节点,
另一个子节点为右子节点的树形数据结构。
需求分析:
1、是一个节点的集合
2、每个节点都有三个属性,value,left_child、right_child
实现:
# 首先初始化一个节点对象
/**
* 初始化一个对象,传入一个value(节点的数据)当作参数
* 设置左子节点和右子节点都为null,因为刚初始化,没有子节点
* eg:
* BinaryTree binaryTree = new BinaryTree("a");
* System.out.println(binaryTree);
*
* @param value
*/
public BinaryTree(String value) {
this.value = value;
this.left_child = null;
this.right_child = null;
}
# 其次,实现向左节点和右节点插入新节点的方法
/**
* 给当前节点添加左子节点
*
* 如果当前节点不存在左子节点,则设置添加的节点为当前节点的左子节点
* 如果当前节点存在左子节点,则把该左子节点设置为新节点的左子节点,将当前
* 新节点设置为当前节点的左子节点
* @param value 添加的新节点的值
*/
public void addLeftChild(String value){
if (this.getLeft_child() == null){
this.setLeft_child(new BinaryTree(value)) ;
} else {
BinaryTree newNode = new BinaryTree(value);
newNode.setLeft_child(this.getLeft_child());
this.setLeft_child(newNode);
}
}
/**
* 为当前节点添加右子节点
* @param value
*/
public void addRightChild(String value){
if (this.getRight_child() == null){
this.setRight_child(new BinaryTree(value)); ;
} else {
BinaryTree newNode = new BinaryTree(value);
newNode.setRight_child(this.getRight_child());
this.setRight_child(newNode);
}
}
至此实现完毕
树的遍历
- Depth-First Search(DFS) 深度优先遍历
"DFS" 是树的数据结构遍历和搜索的一种算法,从根节点开始,尽可能的一直沿着每个分支
去搜索,直到没有子节点,重新回到最开始分支继续查找
eg:
# _1_
# / \
# 2 3
# / \
# 4 5
"DFS"遍历顺序为:1-2-4-5-3
遍历过程:
1.从根节点(1) 开始,打印1
2.搜索做左子节点(2),打印2
3.然后搜索左子节点(4),打印4(该节点没有任何子节点)
4.回溯到右子节点(5),打印5(该节点没有任何子节点)
5.回溯到右子节点(3),打印3(该节点没有任何子节点)
6.遍历结束
遍历过程:
1. 打印当前根节点的值
2.遍历左子节点并且打印它的值,如果这个节点为唯一的左子节点
3.遍历右子节点并且打印它的值,如果这个节点为唯一的右子节点
上述示例顺序为:1-2-4-5-3
遍历过程:
1. 先打印左子节点并打印它的值,如果这个节点为唯一的左子节点
2. 打印当前中间节点的值
3. 遍历右子节点的值,并打印它的值,如果这个节点为唯一的右子节点
上述示例顺序为:4-2-5-1-3
1. 遍历左子节点并且打印它的值,如果这个节点为唯一的左子节点
2. 遍历右子节点并且打印它的值,如果这个节点为唯一的右子节点
3. 打印根节点的值
上述示例顺序为:4-2-5-3-1
- Breadth-First Serach(BFS) 广度优先遍历
“BFS” 是树的数据结构遍历和搜索的一种算法,它从根节点开始,首先查找相邻的兄弟节点,直到
兄弟节点搜索完毕,然后开始搜索下一级节点。
eg:
# _1_
# / \
# 2 3
# / \ /
# 4 5 6
"BFS" 遍历顺序为:1-2-3-4-5-6
遍历过程:
1.Level/Depth 0:只有一个节点1
2.Level/Depth 1:有2和3两个节点
3.Level/Depth 2:有4、5、6三个节点
此处采用 queue 数据结构来实现
工作原理:
1.首先通过队列put方法,添加根节点到queue
2.当queue不为空时,遍历这个队列
3.获取队列中第一个节点的值,并打印它
4.把左、右子节点都添加到queue中(如果当前节点有子节点)
5.完毕,这样就可以一级一级的打印出每个节点的值
二叉树有时被称为有序二叉树,因为它的值按照一定的顺序排序,因此,查询或者
其他的一些操作可以利用这个原则。
最重要的:二叉树搜索是二叉树节点的值总是大于它左子节点的值,但是始终小于
它右子节点的值